位運算,自低(右)向高(左)逐個地將數字1轉置為0

2021-08-28 21:39:42 字數 826 閱讀 7432

對任意整數n,不妨設其最低(右)的數字對應2^k,於是n的二進位制展開應該如下:

x   x...x1 0 0 ...  0

其中最右邊第一次1出現時,數字x可能是0或1,而最低的k+1位必然是「1 0 0...0」 ,即數字1之後是k個0。

於是相應的,n-1的二進位制展開應該如下:

x    x...x0 1 1 ...  0

也就是說,其最低位的k+1於n恰好相反,其餘的(更高位各位相同)。

因此,二者做與運算(n & (n - 1))的結果應為:

x    x...x0 0 0 ...  0

等效於將原n二進位制展開的最低位1轉置為0。

舉個例子:

13 的二進位制 1 1 0 1 , 最低位的1為0 0 0 1 。第一次將其反置為0,使之1 1 0 0 。

13-1=12,二進位制 1 1 0 0, 13&12 即 1 1 0 1 & 1 1 0 0 ,成功得到 1 1 0 0 。

12-1=11,二進位制 1 0 1 0 , 1 1 0 0 & 1 0 1 0 ,成功消除從右第二位的1,得到 1 0 0 0 。

8 -1= 7, 二進位制 0 1 1 1,   1 0 0 0 & 0 1 1 1 ,成功全部將所有1置位。

int countones1 (unsigned int n)

return ones;

}

位運算的自悟

口訣 清零取反要用與,某一位置可用或。若要取反和交換,輕輕鬆鬆用異或。1.先舉個例子,6的二進位制是 110 所以 在補0 後顯示為 0000 0011。沒錯,如你所見,二進位制在 補0後 是以 後為前的排序2.給定整數 n與m.進行位運算操作 1 m 這是個非常 常用的操作,常用於 對n的第m位數...

C語言邏輯運算子的應用以及位運算左移與右移

加 減 乘 除 取餘 其中取餘顯示的是餘數,注意除數不能為0,計算機運算與數 算不同,如1自加 或自減 的使用,都是對變數的值進行加1或減 操作,只有變數才能使用,常用於迴圈。可放在變數之前也可放在變數之後,放在變數之前為前自變,加1或減1操作立即有效 放在變數之後為後自變,加1或減1操作下一行 才...