Java 为什么移位一个移位字节会根据移位顺序产生不同的值?
考虑以下Java代码:Java 为什么移位一个移位字节会根据移位顺序产生不同的值?,java,casting,bit-manipulation,byte,bit-shift,Java,Casting,Bit Manipulation,Byte,Bit Shift,考虑以下Java代码: byte a = (byte) 0b01111110; //Binary Literal byte b1 = (byte) (a << 1); byte c1 = (byte) (a >> 1); byte b2 = (byte) (b1 >> 1); byte c2 = (byte) (c1 << 1); System.out.println("A:" + a + " B1:
byte a = (byte) 0b01111110; //Binary Literal
byte b1 = (byte) (a << 1);
byte c1 = (byte) (a >> 1);
byte b2 = (byte) (b1 >> 1);
byte c2 = (byte) (c1 << 1);
System.out.println("A:" + a + " B1:" + b1 + " C1:" + c1 + " B2:" + b2 + " C2:" + c2);
为什么字节“b2”的值不等于“a”(本例中为“c2”)的值,即使这两个移位都不会导致二进制数字被删除?因为符号扩展。使用
>
可防止:
byte a = (byte) 0b01111110; // 0b01111110 = 126
byte b1 = (byte) (a << 1); // 0b11111100 = -4 <-- overflow
byte c1 = (byte) (a >> 1); // 0b00111111 = 63
byte b2 = (byte) (b1 >> 1); // 0b11111110 = -2 <-- sign extension
byte c2 = (byte) (c1 << 1); // 0b01111110 = 126
byte x = (byte) (b1 >>> 1); // 0b01111110 = 126 <-- no sign extension
字节a=(字节)0b01111110;//0b01111110=126
字节b1=(字节)(A1);//0B0011111=63
字节b2=(字节)(b1>>1);//0B111110=-2>1);//0b01111110=126
…这两个移位都不会导致二进制数字丢失
错。
所有移位操作都会导致数字丢失。幸运的是,你所观察到的似乎只是反驳这一点,因为0
位正在被丢弃。我认为你的问题必须与理解算术移位有关(>
和
)。当执行算术移位时,符号位被扩展以保留a数字的符号性
引用Java的话:
有符号左移位运算符“”将位模式移位到
正确的。位模式由左侧操作数和
要由右侧操作数移位的位置数。未签名的
右移运算符“>>>”将零移到最左边的位置,
而“>>”之后最左边的位置取决于符号扩展
因为你已经满溢了。我不认为这是“愚蠢的运气”,那只是你的假设,而且非常主观Java没有一个:“好的事情完全是偶然发生的,没有计划或应得的”。你认为这是偶然的,不是故意的。从你的链接,同义词:侥幸,偶然。如果你仔细重读他的问题,你会发现是愚蠢的运气导致这些变量匹配:二进制零被移开了。无论如何,我不会在这个网站上争论英语的语义学,所以请随意发表另一条评论——我将忽略它。
byte a = (byte) 0b01111110; // 0b01111110 = 126
byte b1 = (byte) (a << 1); // 0b11111100 = -4 <-- overflow
byte c1 = (byte) (a >> 1); // 0b00111111 = 63
byte b2 = (byte) (b1 >> 1); // 0b11111110 = -2 <-- sign extension
byte c2 = (byte) (c1 << 1); // 0b01111110 = 126
byte x = (byte) (b1 >>> 1); // 0b01111110 = 126 <-- no sign extension