位運算基本操作知識小結
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 表示,而二進位制有三種不同的表示形式 原碼 反碼和補碼。計算機內部使用補碼來表示。原碼,就是其二進位制表示 注意,有一位符號位 反碼,正數的反碼就是原碼,負數的反碼是符號位不變,其餘位取反 ...