+-

我试图从另一个字节中减去一个字节,同时确保没有溢出发生,但是得到了意外的结果.
我的情况是我有一个字节的黑白图像,我想减去背景.因此,我需要使用字节并防止溢出的发生.从其他图像中减去背景图像时,我大概在字节的有符号性方面遇到一些困难. 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中字节之间的减法/差异 - 乐贴网