在討論位運算之前有必要補充一下計算機底層使用的編碼表示,計算機內部儲存、計算的任何資訊都是由二進位制(0和1)表示,而二進位制有三種不同的表示形式:原碼、反碼和補碼。計算機內部使用補碼來表示。
原碼,就是其二進位制表示(注意,有一位符號位)
反碼,正數的反碼就是原碼,負數的反碼是符號位不變,其餘位取反
補碼,正數的補碼就是原碼,負數的補碼是反碼+1
符號位,最高位為符號位,0表示正數,1表示負數。在位運算中符號位也參與運算。
按位與操作 &
1
&
1
=
1
1
&
0
=
0
0
&
1
=
0
0
&
0
=
0
例如:3 & 17 = 1
3=00000011
17=00010001
&=00000001
按位或操作 |
1
&
1
=
1
1
&
0
=
1
0
&
1
=
1
0
&
0
=
0
例如:3 | 17 = 1
3=00000011
17=00010001
|=00010011
左移操作 <<
左移操作 << 是把運算元整體向左移動,左移操作是二目運算子。
例如:33 << 2 = 100001 << 2 = 10000100 = 132
-2147483647 << 1 = 10000000000000000000000000000001 << 1 = 10 = 2 (符號位也參與運算)
技巧:a << n = a * 2^n (a為正數)
右移操作 >>
右移操作 >> 是把運算元整體向右移動,右移操作是二目運算子。
例如:33 >> 2 = 100001 >> 2 = 001000 = 8
-2147483647 >> 1 = 10000000000000000000000000000001 << 1 = 11000000000000000000000000000000 = -1073741824 (符號位也參與運算,補足符號位)
技巧:a >> n = a / 2^n (a為正數)
按位異或操作 ^
按位異或 ^ 操作是把兩個運算元做按位異或操作,其中兩位相同則為0,不同則為1,按位異或是二目運算子,又稱為不進製加法。
1
^ 1
=
0
1
^
0
=
1
0
^
1
=
1
0
^
0
=
0
例如:33 ^ 12 = 45
33=00100001
12=00001100
^ = 00101101
技巧:異或是不進製加法,兩個數做加法,把進製捨去
位運算的技巧
檢測乙個無符號數是不為2 n 1 為冪 x x 1 將最右側0位改為1位 x x 1 二進位制補碼運算公式 x x 1 x 1 x x 1 x x 1 x x 1 x y x y 1 x y x y x y x y 1 x y x y x y x y x y x y x y y x y x y x ...
位運算的技巧
1.找到乙個整數的二進位制中最後一位1的位置 int split a a 1 a int split a a 1 注意split不是位置。2.將乙個數的最後一位1變為0 n n n 1 3.乙個整數的二進位制中1的個數 int res 0 while n 0 return res 4.判斷乙個數是不...
位運算的技巧
2019 09 03 10 29 36 x x 1 相當於消除了 x 從右向左數遇到的第乙個 1。應用 一 用 o 1 時間檢測整數 n 是否是 2 的冪次。若 n 是 2 的冪次,則 n n 1 0。應用 二 計算整數二進位制中包含 1 的個數。public int countones int n...