1. 程式人生 > >關於(二進位制)位移運算:帶符號右移位;帶符號左移位;無符號右移位

關於(二進位制)位移運算:帶符號右移位;帶符號左移位;無符號右移位

>> 帶符號右移位

分析: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