> b"的處理,先做b mod 32||64運算, 如果a是int型,取mod 32,如果a是double型,取mod 64,然後再使用上面提到的通用移位運算規則進行移位。"/> > b"的處理,先做b mod 32||64運算, 如果a是int型,取mod 32,如果a是double型,取mod 64,然後再使用上面提到的通用移位運算規則進行移位。">

首頁  >  文章  >  Java  >  Java的位移運算巧法

Java的位移運算巧法

高洛峰
高洛峰原創
2016-12-16 17:05:551546瀏覽

左移操作: x

x可以是byte, short, char, int, long基本型, n(位移量)只能是int型

編譯器的執行步驟:

1) 如果x是byte, short, char類型, 則將x提升為int;

2) 如果x是byte, short, char, int類型, 則n被重新賦值(過程是:取n的補碼的低5位再轉成十進制的int值,相當對n取32模: n=n%32);

如果x是long型, 則n被重新賦值(過程是:取n的補碼的低6位再轉成十進制的int值,相當對n取64模: n=n%64);

(因為int型別為4個位元組,即32位元,移動32位元將沒有任何意義.對於long則是模64)

3) 對x左移n個位數, 整個表達式產生一個新值(x的值不變);

>>是帶符號位的右移符號,x>>1就是x的內容右移一位,如果開頭是1則補1,是0責補0,( x的內容不改變).

>>>是不帶符號位的右移,x>>>1就是x的內容右移一位,開頭補0(x的內容並不改變)

補充說明:

Java代碼

// 左移: 向左移动,右边补0   
for (int i = 0;i < 8 ;i++)   
System.out.print( (1 << i) + " ");

output

1 2 4 8 16 32 64 128

// 右移: 向右移动,如果符号位(int型为32位)为0,左边补0,符号位为1,左边补1   
// 符号位为1的右移   
for (int i = 0;i < 8 ;i++)   
System.out.print( Integer.toHexString(0x40000000 >> i) + " ");

output

00 00 1000000 800000

 // 符号位为1的右移   
// 最高4位为1000, 右移1位,变成1100也就是c,   
for (int i = 0;i < 8 ;i++)   
System.out.print( Integer.toHexString(0x80000000 >> i) + " ");

output

80000000 c0000000 e0000000 f0000000 f8000000 fc0000000 f0000000上面的通用法則沒有錯,但是有一個限制,對int型,移位的位數不超過32,對long型,移位的位數不超過64。現在進行如下測試:

Java程式碼

System.out.println(Integer.toHexString(0x80000000 >> 31));   
// output: ffffffff   
System.out.println(Integer.toHexString(0x80000000 >> 32));   
// output: 80000000

0x80000000在右移31位後,每個位都成了1(也就是-1),按照這個想法,右移32位理所當然的還是-1,可是右移32位後,得到的結果卻又這個數本身。

透過對int,long型資料左右移測試,發現:

Java對移位運算"a > b"的處理,首先做b mod 32||64運算, 如果a是int型,取mod 32,如果a是double型,取mod 64,然後再使用上面提到的通用移位運算規則進行移位。

到這裡,就可以理解為什麼在BitSet類別中是

1L << bitIndex

這條語句,因為熟悉jdk的Programer知道,再寫 1L

更多Java的位移運算巧方法相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn