二進位製小技巧

2022-05-26 23:03:08 字數 1758 閱讀 2400

目錄(?)

[-]xx-1

xx1xx1

x-x現在令 x = 10101000,接下來我們算一下 x&(x-1)的結果。

首先我們回憶一下二進位制減法的規則:

0-0=1-1=0 

1-0=1

0-1=1(向高位借位)

例如,(11000011)2-(00101101)2的算式如下:

11000011 被減數

00101101 減數

--1111 借位 (減號是對齊美觀用的)

-------------------

10010110 差數

回到剛才的運算,根據二進位制減法的規則,我們得: 

x-1 = 10100111, 

& x  = 10101000, x & (x-1) = 10100000

我們可以看出,x的最右邊的1變成了0,如果我們繼續對得到的結果再次執行這樣的運算時,發現結果又變為 10000000,由此我們得到結論:x&(x-1) 是將二進位制數最右邊的1變成0,如果沒有1則生成的二進位制位全為0。

??? 

我們看下面程式會輸出什麼 

???

#include

int function(int num)

return

count;

}int main()

答案是:6 

9999的二進位制為1101111000,上面的function函式,利用x&(x-1)這個技巧,得到引數num轉化為二進位制後含1的個數。共有6個1,所以最後的輸出結果為6。

我們可以用此式來檢查乙個無符號數是否是2的冪。

令 x = 10101 011,則 x+1 = 10101100,x&(x+1) = 10101 000, 

我們看出 x&(x+1) 將乙個二進位制數最右邊0後的1全置為0。可以用來檢測乙個無符號整數是否為2^n - 1的形式(包括0和所有位均為1的情況)。

析出最右側的0位, 

例:10100111 -> 00001000

析出最右側的1位,如果都沒有則生成位均為0的數。

-x  的演算法是 對x取反,再加1。 

對 x = 01011000,-x = 10101000,x&(-x) = 00001000,即01011000 -> 00001000

當x為0時,x&(-x) 即 0 & 0,結果為0;

當x不為0時,x和-x必有乙個為正。設x為正。

當x為奇數時,最後一位為1,取反加1沒有進製,故x和-x除最後一位外前面的位正好相反,按位與結果為0,最後一位都為1,故結果為1。

當x為偶數,且為2的m次方(m>0)時,x的二進位制表示中只有一位是1(從右往左的第m+1位),其右邊有m位0,左邊也都是0(個數由表示x的位元組數決定),故x取反加1後,從右到左第有m個0,第m+1位及其左邊全是1。這樣,x& (-x) 得到的就是x。

當x為偶數,卻不為2的m次方的形式時,可以寫作x= y * (2^k)。其中,y的最低位為1。實際上就是把x用乙個奇數左移k位來表示。這時,x的二進位制表示最右邊有k個0,從右往左第k+1位為1。當對x取反時,最右邊的k位0變成1,第k+1位變為0;再加1,最右邊的k位就又變成了0,第k+1位因為進製的關係變成了1。左邊的位因為沒有進製,正好和x原來對應的位上的值相反。二者按位與,得到:第k+1位上為1,左邊右邊都為0。結果為2^k,即x中包含的2的最大次方的因子。比如x=32(100000)時,其中2的最大次方因子為2^5,結果為32;x=28(11100)時,2的最大次方因子為2^2,結果為4。

二進位製小技巧

二進位制嘛,可以加速 a 2 a 1 a 2 a 1 2 b 1 b 可以判斷一些東西 a 1 a 2 1 a 1可以求出數的乙個相鄰數 等等等等 下面我會在做題目時記錄一下位運算的技巧 這題讓我們統計區間顏色種類,種類不超過30種 那我們可以用位運算來壓縮 開乙個int,轉換成二進位制後可以清晰的...

二進位制運算技巧

假設都在x86或x86 64架構cpu上進行運算,二進位制基本運算包括,加減乘除 與 或 異或 同或 移位等 假設n 為 32 位整形數,取正整數n除以8的餘數 n 0x07 假設n 為 32 位整形數,取正整數n除以16的餘數 n 0x0f 假設n 為 32 位整形數,8位對齊 n 7 0xfff...

技巧 二進位制列舉

題目 第一行,輸入兩個整數 n,x 1 n 20,1 x 2000 n,x 1 leq n leq 20,1 leq x leq 2000 n,x 1 n 20 1 x 200 0 接下來輸入 n n 個整數,每個整數不超過 100100。輸出乙個整數,表示能湊出 xx x 的方案數。方法 二進位制...