關於(二進位制)位移運算:帶符號右移位;帶符號左移位;無符號右移位
>> 帶符號右移位
分析:num>> n
(1)相當於num(num的二進位制)向右移動n位。
(2)正數移位:右邊(低位)移出部分,直接捨棄,左邊(高位)移入部分全部補0。(正數的符號為是0)
負數移位:右邊(低位)移出部分,直接捨棄,左邊(高位)移入部分全部補1。(負數的符號為是1)
(3)移位結果:相當於num除以2的n次方後,向下取整。正負數通用;
正數移位(2的n次方大於num)大於本身時,結果為0;移位足夠大時結果為本身(暫未深入研究)
負數移位(2的n次方大於num的絕對值)大於本身絕對值時,結果為-1;移位足夠大時結果為本身(暫未深入研究)
num>>0位後,結果為其本身;
0>>n後仍然為0。
案例:
System.out.println(8>>1); 結果:4 System.out.println(-8>>1); 結果:-4
System.out.println(8>>2); 結果:2 System.out.println(-8>>2); 結果:-2
System.out.println(7>>1); 結果:3 System.out.println(-7>>1); 結果:-4
System.out.println(7>>2); 結果:1 System.out.println(-7>>2); 結果:-2
System.out.println(8>>0); 結果:8 System.out.println(-8>>0); 結果:-8
System.out.println(8>>100); 結果:0 System.out.println(-8>>100); 結果:-1
System.out.println(8>>1000000); 結果:8 System.out.println(-8>>10000000); 結果:-8
<< 帶符號左移位
分析:num<< n
(1)相當於num(num的二進位制)向左移動n位。
(2)左邊(高位)移出部分,直接捨棄;右邊(低位)移入部分全部補0。
(3)移位結果:相當於num乘以2的n次方,移位足夠大時,結果為其本身(暫未深入研究)。正負數通用;
num>>0位後,結果為其本身;
0<<n後仍然為0。
案例:
System.out.println(8<<1); 結果:16 System.out.println(-8<<1); 結果:-16
System.out.println(8<<2); 結果:32 System.out.println(-8<<2); 結果:-32
System.out.println(7<<1); 結果:14 System.out.println(-7<<1); 結果:-14
System.out.println(7<<2); 結果:28 System.out.println(-7<<2); 結果:-28
System.out.println(8<<0); 結果:8 System.out.println(-8<<0); 結果:-8
System.out.println(8<<1000000); 結果:8 System.out.println(-8<<1000000); 結果:-8
>>> 無符號右移位
分析:num>>>n
(1)對於正數和0,無符號右移位>>>和帶符號右移位>>,結果是一樣的。
(2)負數移位:右邊(低位)移出部分,直接捨棄,左邊(高位)移入部分全部補0。(符號為由1變成0,所以負數變正數)
(3)移位結果:正數移位相當於num除以2的n次方後,向下取整;當移位(2的n次方大於num)大於本身時,結果為0;
負數移位需要根據以後結果進行計算;
當移位(2的n次方大於num)遠大於本身時,結果為num本身,正負數通用。
num>>>0位後,結果為其本身;
0>>>n後仍然為0。
案例:
System.out.println(8>>>1); 結果:4 System.out.println(-8>>1); 結果:2147483644
System.out.println(8>>>2); 結果:2 System.out.println(-8>>2); 結果:1073741822
System.out.println(7>>>1); 結果:3 System.out.println(-7>>1); 結果:2147483644
System.out.println(7>>>2); 結果:1 System.out.println(-7>>2); 結果:1073741822
System.out.println(8>>>0); 結果:8 System.out.println(-8>>>0); 結果:-8
System.out.println(8>>>100); 結果:0 System.out.println(-8>>>100); 結果:268435455
System.out.println(8>>>1000000); 結果:8 System.out.println(-8>>>10000000); 結果:-8