编程语言
首页 > 编程语言> > java-添加后出现意外结果

java-添加后出现意外结果

作者:互联网

我现在正在用Java编写一个个人项目,并且最近第一次使用位操作.我试图将两个字节转换为短字节,一个字节为高8位,另一个字节为低8位.

运行下面的第一行代码时遇到错误.

错误的结果

short regPair = (short) ( (byte1 << 8) + (byte2) );

正确的结果

short regPair = (short) ( (byte1 << 8) + (byte2 & 0xFF) );

预期结果为:AAAAAAAABBBBBBBBBB,其中A代表字节1中的位,B代表字节2中的位.

使用第一行代码,我将得到一个位移后的字节1与添加字节2之间的典型加法.

错误结果示例

byte1 = 11, byte2 = -72

result = 2816 -72
       = 2744

当使用产生预期结果的代码行时,我可以得到3000的正确答案.我很好奇字节2为什么需要位屏蔽.我的想法是,它将加法之前将byte2转换为二进制,然后对两个字节执行二进制加法.

解决方法:

在不正确的情况下,由于运算符,byte2被提升为int.这不仅意味着在字节2的二进制表示形式的开头添加一些零.由于Java用two’s complement表示整数类型,因此将添加1.升级后,byte2变为:

1111 1111 1111 1111 1111 1111 1011 1000

通过做& 0xFF,则先强制提升为int,然后保留最低有效8位:1011 1000,并使其他所有内容均为0.

标签:bitmask,bit-manipulation,java
来源: https://codeday.me/bug/20191024/1923753.html