我对位运算符感到困惑。每当我做99(0110 0011)< < 2,答案是396.我对左移的理解是在右侧添加两个0。所以我的答案是140(1000 1100)而不是396.为什么Java中的答案是396?按位运算符左移
按位运算符左移
回答
由于Java int
是带符号的32位数量(不是8位),向左按位移2(<< 2
)与* 4
相同。你可以看到这个像
int i = 99;
System.out.printf(" %s (%d)%n", Integer.toBinaryString(i), i);
i <<= 2;
System.out.printf("%s (%d)%n", Integer.toBinaryString(i), i);
输出是
1100011 (99)
110001100 (396)
感谢您的回复。它现在很有意义。 :) –
你只示出8位,但一个int
为32位。
byte 8 bits
short 16 bits
int 32 bits
long 64 bits
在Java中整数计算被强制为int
或long
,所以即使你的99
价值为一个byte
的((byte)99) << 2
结果仍然是一个int
。
0110 0011 = 99 (byte)
0000 0000 0000 0000 0000 0001 1000 1100 = 396 (int)
现在,你可以随时将它转换回一个byte
,这将放弃所有高序位:
(byte)(99 << 2) = (byte)0b10001100 = (byte)0x8C = -116
或者你可以丢弃的高位,同时保持它的int
:
(99 << 2) & 0xFF = 0b10001100 = 0x0000008C = 140
哦!这更有意义!谢谢! :) –
@JonathanNelsonCastillo如果这是您正在寻找的答案,请点击对号接受答案,以便其他人可以看到您的问题已得到充分解答。 – Andreas
- 1. PHP /按位运算符左移
- 2. 左移位运算符C++
- 3. 向左移位运算符
- 4. 按位运算符
- 5. 按位运算符
- 6. 整数移位运算符
- 7. 关于移位运算符
- 8. java按位左移
- 9. 了解按位运算 - 移位和AND
- 10. Python中的左移运算符
- 11. Javascript按位运算符
- 12. C++'>'按位运算符
- 13. 按位'&'运算符on uint
- 14. 按位运算符&逻辑
- 15. Haskell按位运算符Data.Bits
- 16. JavaScript和按位运算符
- 17. 按位不运算符
- 18. 按位补运算符
- 19. C++按位或运算符
- 20. 按位余数运算符
- 21. 负位数移位的位移符号运算符
- 22. 如何在android中的按钮上显示左移运算符?
- 23. 如何在EL中使用按位移位运算符
- 24. 与负操作数的Java按位移位运算符
- 25. 按位算术和运算符
- 26. C++按位左移32
- 27. 按位和左/右移
- 28. 位运算在C:从左
- 29. 按位运算
- 30. 什么是左,右移位位运算符的使用>><<和
通过“添加两个零”,它实际上将二进制向左移两次,因此是操作符的名称。对于小整数,数字不会从左侧落下 –