位運算的技巧

2022-07-07 14:06:13 字數 2204 閱讀 9586

在討論位運算之前有必要補充一下計算機底層使用的編碼表示,計算機內部儲存、計算的任何資訊都是由二進位制(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...