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