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 num)return res;
}
應用
三、將整數a轉成整數b,需要修改多少bit。
a ^ b 後對其中 1 的個數計數即可。
首先考慮特例,全1的情況,如111,其子集毫無疑問是001 - 111,可以不斷的減1即可。
下面考慮一般情況,如1011,首先可以確定是其子集必然是比1011小的數字,所有如果我們依然去不斷的減少1,並且進行判斷無效位0,就可以得到其所有的子集,但是這種方法中間有很多的狀態是無效的,如何快速得到子集呢。
先給一些結論:
1)subset <= num
2) subset1 > subset2 -> subset1 & num > subset2 & num
有了這兩個結論就可以了,設s = num,s 是 num的子集,令s = (s - 1) & num,s 必然是第二大的子集,重複上述操作就能得到第三大的子集,一直到s == 0,就可以列舉掉所有的子集。
for (int s = mask; s > 0; s = (s - 1) & mask)
x & -x 在樹狀陣列中有非常多的應用,可以通過x & -x來得到乙個數的lowbit。這裡的lowbit就是乙個數末尾1所表示的數字,比如0100的lowbit就是4。
位運算的技巧
檢測乙個無符號數是不為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 表示,而二進位制有三種不同的表示形式 原碼 反碼和補碼。計算機內部使用補碼來表示。原碼,就是其二進位制表示 注意,有一位符號位 反碼,正數的反碼就是原碼,負數的反碼是符號位不變,其餘位取反 ...