最近在看《JAVA解惑》,看到移位操作符这一块感觉比较陌生,特意写一篇博客记录一下。
由于int型数值占4个字节,所以它是2的32次方。由于32是2的5次方。而对于long型数值占8个字节,所以是2的64次方。由于64是2的6次方。
结论:对于int型数值,移位操作符只使用其右操作数的低5位做为以为长度(移位长度介于0到31)。对于long型数值,移位操作符只使用其右操作数的低6位做为以为长度(移位长度介于0到63)。
看下面的程序:
int count=0;
int num=-1;
for(int i=0;i<=32;i++){
System.out.println(num<<i);
System.out.println("count is: "+(count++));
}
//运行结果:
-1
count is: 0
-2
count is: 1
-4
count is: 2
-8
count is: 3
-16
count is: 4
-32
count is: 5
-64
count is: 6
-128
count is: 7
-256
count is: 8
-512
count is: 9
-1024
count is: 10
-2048
count is: 11
-4096
count is: 12
-8192
count is: 13
-16384
count is: 14
-32768
count is: 15
-65536
count is: 16
-131072
count is: 17
-262144
count is: 18
-524288
count is: 19
-1048576
count is: 20
-2097152
count is: 21
-4194304
count is: 22
-8388608
count is: 23
-16777216
count is: 24
-33554432
count is: 25
-67108864
count is: 26
-134217728
count is: 27
-268435456
count is: 28
-536870912
count is: 29
-1073741824
count is: 30
-2147483648
count is: 31
-1
count is: 32
惊奇地发现若让int型数值移位32(-1<<32),竟然等于自身。
但是如果这样:-2147483648<<1; 就会得到-1左移位32的结果。
还有一点:会经常被误解就是:很多人会认为负移位长度的右移操作可以起到左移操作的作用。
就是说对于 1>>-1,可能会被误认为是左移一位。
事实是右移操作符总是起到右移的作用,而左移操作符总是起到左移操作符。负的移位长度只保留低5位而且去除其他位转换成正的移位长度。比如将一个int数值左移,移位长度是-1,那么移动效果就是它被左移了31位。
对于int型数值,移动长度对32取余数,对于long型数值,移动长度对64取余数。