位運算的技巧

2022-08-11 09:09:11 字數 920 閱讀 6934

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