位運算相關操作整理

2021-08-21 13:51:19 字數 2154 閱讀 7083

and( & ) : 通常用於二進位制位操作,如乙個數&1的結果就是取二進位制的最末尾,可以用來判斷整數奇偶

or( | ) : 通常用於二進位制定位上的無條件賦值,例如乙個數or1的結果就是把二進位制最末位強行變成1,若要變成0則減1就可以了,實際意義就是把這個數強行變成最接近的偶數

xor( ^ ) : 通常用於對二進位制的特定一位進行取反,可以對兩個數進行交換

not( ~ ) : 取反,注意的是整數型別有沒有符號,如果是無符號整數,那麼得到的值為其與上界的差

left shift( << ) : 左移,在二進位制數每添一位0就相當於乘2,因此每左移一位就相當於乘2;並且在常量的定義上,比如可以通過1 << 16來表示65535

對應與集合運算則是交集、並集、差集和補集,假設集合 a 是,集合 b 是,全集為那麼:

經典題型:做數獨時我們需要27個hash表來統計每一行、每一列和每乙個小九宮格裡已經有哪些數了。此時,我們可以用27個小於2^9的整數進行記錄。例如,乙個只填了2和5的小九宮格就用數字18表示(二進位制為000010010),而某一行的狀態為511則表示這一行已經填滿。需要改變狀態時我們不需要把這個數轉成二進位制修改後再轉回去,而是直接進行位操作。在搜尋時,把狀態表示成整數可以更好地進行判重等操作。

功能

位運算去掉最後一位

x >> 1

最後加乙個0

x << 1

最後加乙個1

(x << 1) + 1

把最後一位變成1

x | 1

把最後一位變成0

(x | 1) - 1

最後一位取反

x ^ 1

把右數第k位變成1

x | (1 << (k-1))

把右數第k位變成0

x & ~(1 << (k-1))

右數第k位取反

x ^ (1 << (k-1))

取末三位

x & 7

取末k位

x & ( ( 1 << k ) -1)

取右數第k位

x >> (k -1) & 1

把末k位變成1

x | ( ( 1 << k) - 1 )

末k位取反

x ^ ( ( 1 << k) -1 )

把右邊連續的1變成0

x & (x + 1)

把右起第乙個0變成1

x | (x+1)

把右邊連續的0變成1

x | (x-1)

取右邊連續的1

(x ^ (x+1)) >> 1

去掉右邊第乙個1的左邊(樹狀陣列)

x & (x ^ (x-1))

如何在陣列中對指定位置置1

就像上面**提到的,把右數第k位變成1,這裡也是這個原理,但是要注意陣列中,一般整型32位,所以

//在第i個位置寫i

for (i = 0; i < 40; i ++)

class="se-preview-section-delimiter">

變換符號,把正數變為負數,負數變為正數

變換符號只需要取反加1即可

~a + 1

class="se-preview-section-delimiter">

求絕對值

方法1:對於負數可以通過對其取反加1來得到整數,先移位來取符號為,int i = a >> 31;如果a為正數,i等於0,如果為負數,i等於-1,

int i = a >> 31;

return i == 0 ? a : (~a + 1);

class="se-preview-section-delimiter">

方法2:任何數,與0異或都保持不變,與-1(0xfffffffff)異或相當於取反,因此a與i異或再減i也可以得到絕對值

int i = a >> 31;

return ((a ^ i) - i);

位運算知識整理

位運算操作符 位邏輯非運算 位邏輯與運算 位邏輯或運算 位邏輯異或運算 位左移運算 位右移運算using system using system.collections.generic using system.linq using system.text namespace 集合 renum 如果...

位運算相關總結

計算機cpu中alu是由邏輯門構成的,非常善於位運算。因此,在程式中使用位運算,經常能夠加快程式執行。另外,掌握一些位運算的相關知識也能增加一些程式設計的樂趣。位運算經常使用到異或運算和與運算。異或運算符合交換律 結合律,它的特點是相同為0,不同為1。與運算是同為1則為1。詳細內容 1 兩個數比較大...

位運算相關總結

按位與運算子 參加運算的兩個資料,按二進位制位進行 與 運算 運算規則 兩位同時為1結果才為 1,否則為 0.負數按補碼形式參加按位與運算 與運算 的特殊用途 1 清零。如果想將乙個單元清零,即使其全部二進位制位為0,只要與乙個各位都為 0的數值相與,結果為 0.2 取乙個數中指定位 方法 找乙個數...