java高級之java的左移運算符和右移運算符

1. java移位運算小技巧

左移一位相當於乘以2的1次方,左移n位就相當於乘以2的n次方。
右移一位相當於除以2的1次方,右移n位就相當於除以2的n次方。

比如
10 << 1 = 20
10 << 3 = 80
6 >> 1 = 3
6 >> 2 = 1

想要深入理解移位運算,就一定要對計算機的原碼、反碼、補碼非常熟練。
可以參考:點我

你要知道3個事:
(1)機器都是使用補碼,運算也是使用補碼運算。
(2)正數的原碼補碼反碼都一樣。
(2)補碼與原碼相互轉換,其運算過程是相同。

2. 原碼,反碼,補碼

java裏byte是佔1個字節的,1個字節等於8個位。8個位裏的第1位是符號位,用來表示是正數還是負數。
所以byte能表示的最大機器數也就是[0111 1111],也就是255。

byte a = 5 ;
[ +5 ] = 原碼[ 0000 0101 ] = 反碼[ 0000 0101 ] = 補碼[ 0000 0101 ]
[ -5 ] = 原碼[ 1000 0101 ] = 反碼[ 1111 1010 ] = 補碼[ 1111 1011 ]

3. 怎麼進行移位運算

移位運算符分左移位(<<)、右移(>>)、無符號右移(<<<)
其中無符號右移這裏就不討論了,java裏沒用到。

(1)左移
運算方式:數值的補碼全部往左移動X位,符號位和最高位都捨棄,最低位補0。
正數:
int a = 5 ;
int b = a << 2 ;
[ 0000 0000 0000 0000 0000 0000 0000 0101 ] 5的補碼
[ 0000 0000 0000 0000 0000 0000 0001 0100 ] 對於正數而言,反碼就是原碼,即 20

負數:
int a = -5 ;
int b = a << 2 ;
[ 1000 0000 0000 0000 0000 0000 0000 0101 ] -5的原碼
[ 1111 1111 1111 1111 1111 1111 1111 1010 ] -5的反碼
[ 1111 1111 1111 1111 1111 1111 1111 1011 ] -5的補碼
[ 1111 1111 1111 1111 1111 1111 1110 1100 ] a<<2左移2位
將補碼轉換成原碼就可以得到數值,補碼轉原碼和原碼轉補碼一樣,上面說過了。
[ 1000 0000 0000 0000 0000 0000 0001 0011 ]
[ 1000 0000 0000 0000 0000 0000 0001 0100 ] 得到a<<2的原碼,即 -20
左移n位就相當於乘以2的n次方

(2)右移
運算方式:數值的補碼向右移X位,符號位不變(左邊補上符號位)
正數:
int a = 8 ;
int b = a >> 1;
[ 0000 0000 0000 0000 0000 0000 0000 1000 ] 8的反碼
[ 0000 0000 0000 0000 0000 0000 0000 0100 ] a>>1向右移1位
正數的反碼就是原碼,上面提過了兩次,所以a>>1= 4

負數:
int a = -8 ;
int b = a >> 1 ;
[ 1000 0000 0000 0000 0000 0000 0000 1000 ] -8的原碼
[ 1111 1111 1111 1111 1111 1111 1111 0111 ] -8的反碼
[ 1111 1111 1111 1111 1111 1111 1111 1000 ] -8的補碼
[ 1111 1111 1111 1111 1111 1111 1111 1100 ]  a>>1向右移1位
補碼轉原碼
[ 1000 0000 0000 0000 0000 0000 0000 0011 ]
[ 1000 0000 0000 0000 0000 0000 0000 0100 ]  得到a>>1的原碼,即 -4
右移n位相當於除以2的n次方

4. java裏爲什麼要使用移位運算符

用移位操作可以極大地提高性能,因爲在計算機底層對位的操作是最快的,沒有之一!移位操作雖然快,但是可能會使代碼不太好理解,因此最好加上相應的註釋。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章