别被误导了,这才是java中的真正的逻辑移位和算数移位
程序员文章站
2022-06-03 11:57:33
...
在计算机中,正数和负数都采用补码表示,以下的移位规则,适用于补码,无溢出的情况。如果移位使得符号位发生变化,则发生溢出。
逻辑移位
不考虑数的正负性,符号位会跟着一起移位。
- 逻辑左移,高位移丢,低位补0
- 逻辑右移,低位移丢,高位补0
算数移位:
考虑数的正负性,符号位不会跟着一起移位。
正数:
- 算数左移,高位移丢,低位补0
- 算数右移,低位移丢,高位补0
负数:
- 算数左移,高位移丢,低位补0
- 算数右移,低位移丢,高位补1
从上面这些规则可以看出:
- 逻辑左移和算数左移的规则相同,都是低位补0,所以在java中,算数左移和逻辑左移采用
<<
- 对于负数,逻辑右移和算数右移的规则不一样,所以在java中,逻辑右移采用
>>>
表示,算数右移采用>>
表示
有什么用?
- 对于算数移位,不论数的正负性,算数右移1位就是将数缩小一倍,算数左移一位就是将数扩大一倍。
- 对于逻辑移位,正数的逻辑左移,扩大一倍,正数的逻辑右移,缩小一倍。负数的逻辑左移,扩大一倍,负数的逻辑右移,不确定。
放到java中
-
>>
将数缩小一倍,<<
将数扩大一倍, -
>>>
将正数缩小一倍,负数不确定。
1. 验证逻辑移位,符号位会跟着移动,而算数移位不会。
class Solution {
public static void main(String[] args) {
int a = -128;
print(a);
print(a>>>1);
print(a>>1);
}
private static void print(int a){
System.out.println(a);
System.out.print(" 二进制形式为:");
for (int i = 31; i >= 0; i--) {
if ((i + 1) % 4 == 0) {
System.out.print(" ");
}
System.out.print(a >> i & 1);
}
System.out.println();
}
}
结果如下:
上一篇: 适合减肥吃的水果有哪些?这几种你不能错过