被忽略的技巧 位運算

2021-10-11 02:48:33 字數 2622 閱讀 5973

位運算基本操作知識小結

1.左移操作a《將a的二進位制表示的每一位向左移b位,左邊超出的位截掉,右邊不足的位補0

a = 1100 b = 2

a << b = 110000

2.右移操作a>>b,a>>>b

右移操作分為算數右移和邏輯右移

算術右移是帶符號的右移,邏輯右移是不帶符號的右移。

算術右移:將a的二進位制表示的每一位向右移b位,右邊超出的位截掉,左邊不足的位補符號位的數。

邏輯右移:將a的二進位制表示的每一位向右移b位,右邊超出的位截掉,左邊不足的位補0。

c語言:只有邏輯右移 a >> b

算術右移 a >> b , 邏輯右移 a >>> b

a = 1111111111111111110000001

b = 2

a >> b = 1111111111111111111100000

a >>> b = 0011111111111111111100000

3.按位與操作a&b

將a和b的二進位制表示的每一位進行與操作,只有兩個對應的二進位制位都為1時,結果位才為1,否則為0.

a = 001010

b = 101100

a & b = 001000

4.按位或操作a|b

將a和b的二進位制表示的每一位進行或操作,只要兩個對應的二進位制位有乙個為1,結果位就為1,否則為0.

a = 001010

b = 101100

a | b = 101110

5.按位非操作~a

將a的二進位制表示每一位進行取反操作,如果對應的二進位制位為0,結果位為1,否則為0.

a =01010

~a = 10101

6.按位異或操作a^b

將a和b的二進位制表示的每一位進行異或操作,如果對應的二進位制位不同,結果位為1,否則為0.

a = 001010

b = 101100

a ^ b = 100110

1.1single number/single number ii

乙個陣列中除了乙個數字出現過一次外,其餘的數字都出現了兩次,找出那個只出現一次的數字。

c語言**:

int

number

(vector<

int>

&num)

return result;

}

解釋:異或運算:

1.a ^ a=0

2.a ^ 0=a

3.a ^ b ^ a=b (乙個數異或同乙個數兩次可以還原)

若乙個陣列中只有乙個數字出現一次,則根據上述1和2可知,兩個相同的數異或結果為0,則陣列**現兩次的數異或均為0,只剩下出現一次的數。

1.2一組數字中,有乙個數字只出現一次,其餘的都出現了三次,找出只出現了一次的那個數字。

解法同上題類似

2.乙個十進位制數的二進位制形式中1的個數

與運算利用與運算0&1=0,不斷將乙個非零數不斷將二進位制形式中的1置於0

int

get_one_num

(int n)

return res;

}

3.判斷乙個數是否為2的冪,比如1=2^0, 2=2^1, 4=2^2

與運算利用與運算中,2&1=0,4&3=0,2的冪的二進位制形式一定是第一位為1,其他為0,而它的減一形式一定是這一位為0,其他為1.

例如:8的二進位制是1000 而7的二進位制是111,4的二進位制是100,3的二進位制是11

boolean istwores

(int n)

4.因為位運算比乘法運算快,所以可將x = x * 2 優化為x = x << 1。

x=x/2優化為x=x>>1,提高了運算速度

5、判斷輸入的兩個數m、n的二進位制位上有多少位不同,首先m和n做按位異或運算,將二者的二進位制表示的不相同的部分置1,相同的部分置0,得到乙個數diff,然後統計diff的二進位制表示中有多少位1。

int

differences

(int m,

int n)

return count;

}

6.不用新的變數,交換兩個變數的值

基於異或運算

a=a^b;

b=a^b;

a=a^b;

例如: a=4(二進位制是100) b=3(二進位制是11)

a=a ^ b=4 ^ 3=7

b=a ^ b=7 ^ 3=4

a=a ^ b=7 ^ 4=3

總結

位運算的題型:

1.進製轉換

2.二進位制中1的個數

3.一條語句判斷乙個整數是不是2的整數次方

4.乙個數字改變幾位得到另乙個數字:

5.陣列中數字出現的次數

6.不用加減乘除做加法

位運算的技巧

檢測乙個無符號數是不為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.判斷乙個數是不...

位運算的技巧

在討論位運算之前有必要補充一下計算機底層使用的編碼表示,計算機內部儲存 計算的任何資訊都是由二進位制 0和1 表示,而二進位制有三種不同的表示形式 原碼 反碼和補碼。計算機內部使用補碼來表示。原碼,就是其二進位制表示 注意,有一位符號位 反碼,正數的反碼就是原碼,負數的反碼是符號位不變,其餘位取反 ...