+-
Java中字节之间的减法/差异
我试图从另一个字节中减去一个字节,同时确保没有溢出发生,但是得到了意外的结果.

我的情况是我有一个字节的黑白图像,我想减去背景.因此,我需要使用字节并防止溢出的发生.从其他图像中减去背景图像时,我大概在字节的有符号性方面遇到一些困难. Data2是背景数组,而data1是另一个图像.

在下面的代码中,我希望从data1数组中减去data2数组.但是,当我确定应该有较高的值时,我会得到较低的值.

    for (int i = 0; i < data1.length; i++) {
        if (data1[i] > data2[i]) {
            dest[i] = (byte) (data1[i] - data2[i]);
        } else {
            dest[i] = 0;
        }
    }

我认为我应该确保data2字节不是负数并被添加到data1中.
所以我来到:

    for (int i = 0; i < data1.length; i++) {
        if (data1[i] > data2[i]) {

            dest[i] = (byte) ((int)data1[i] & 0xff - (int)data2[i] & 0xff - 128);

        } else {
            dest[i] = 0;
        }
    }

但是,这也无法给出正确的结果.

我目前对此的想法是:

(byte) ((int)data1[i] & 0xff - (int)data2[i] & 0xff - 128);

(int) cast: make sure bytes are cast to integer.
&0xff: make value unsigned.
- subtraction smaller value from bigger value.
- 128: subtract 128 to make signed again.
(byte): cast back to byte.

我希望我在这里做的事情很愚蠢,或者我的问题出在其他地方,我不知道在哪里.

编辑

我似乎已经找出问题的一部分:
data1 [i]>对字节进行签名时,data2 [i]处理错误(在我的情况下).代替:

        if ((data1[i] & 0xff) > (data2[i] & 0xff)) {

似乎产生了正确的结果,而不是先前的比较.

最佳答案
这里的重点是您的字节来自一个API,该API使用8位编码像素的光,因此它们的范围为0; 0xFF.但是Java字节为-128; 127,因此0x7F之后的任何位模式都将被解释为负数.例如,如果字节是无符号的,则0xF0中的位是128;如果解释为有符号的字节,则是-16:

System.out.println(0xFF > 0);  // true
System.out.println((byte) 0xFF > 0); // false

因此,当比较您的无符号字节时,您想使用Byte.toUnsignedInt(byteVal)(或((int)byteVal)& 0xFF在Java 7上)将像素提升为int.

点击查看更多相关文章

转载注明原文:Java中字节之间的减法/差异 - 乐贴网