演算法技巧 01(位運算)

2021-10-24 08:32:41 字數 2079 閱讀 1885

運算子:<<

運算子後接整數數字,代表左移多少位。

計算方式:整數轉換為的二進位制數向左移 n 位,右邊多出來的位數用 0 補齊,超出的位數直接捨去,比如二進位制數 0000 0001 左移 1 位得 0000 0010

注意:

對於移位負數字,取其補碼的前 8 位為運算元即可

例:-255補碼的前 5 位為0 0001,左移1 位,結果為4(對於負數,vs會警告算術溢位,但不會報錯)

使用方法:

運算子:>>

運算子後接整數數字,代表右移多少位

計算方式:整數轉換為的二進位制數向右移 n 位,左邊多出來的位數用 0 補齊(當被運算元為負數可能補 1,與編譯器有關,c++負數中用 1 補位),超出的位數直接捨去,比如二進位制數 0000 0001 右移 1 位得 0000 0000

同樣,右移也只取運算元的前 5 位

負數也一樣,就不舉例了

使用方法:

運算子:~

計算方式:將二進位制中的 0 全變成 1,1 全變成 0

使用方法:

運算子:&

計算方式:兩者各位分別進行運算,都為1都為1,除此之外都為0。相當於邏輯計算中的 &&(且),當兩者都為真的時候返回true,其中之一為假就為false。在c++中任何不為 0 的數代表 true,為 0 代表false

例:0000 0101 & 0000 0100 = 0000 0100(換成整數為5 & 4 = 4)

特性:清零特定幾位,或者取特定幾位。

例:15(0000 1111)清零前 2 位變成 12(0000 1100),只需15 & 252(1111 1100),即另乙個運算元被清零的位置應為 0 ,其他位置為1

取15前 2 位得 3(11),只需15 & 3(0000 0011),即另乙個運算元被取的位置為 1 ,其他位為 0

使用方法:

運算子:|

計算方式:兩者各位分別進行運算,都為0都為0,除此之外都為1。相當於邏輯計算中的 ||(或),當兩者都為假的時候返回false,其中之一為真就為true

特性:置指定位置為 1(和上面取特定位不同哦,取是不管0 1都保持原樣,置 1 是不管0 1都設為 1)。

例:讓 8(0000 1000)的第 1 位和第 3 位置 1, 8 和 5(101)進行 | 運算結果為 13(0000 1101)。即讓需要置零的位設為 1 不需要的位設為 0 即可

使用方法:

運算子:^

計算方式:兩者各位分別進行運算,兩者相同時為 0(同為 1 或 同為0),兩者不同時為 1(一者為 0 一者為 1)。異就代表要找不同的。所以當 0、1 遇 0 仍為 0、1,遇 1 則取反為 1、0

特性:取反特定幾位

例:將 10(0000 1010)的第 1、2 位取反,10 和 3(0000 0011)進行 ^ 運算得 9(0000 1001)。即將需要取反的位置置為 1 其他位置為 0。

使用方法:

ctrl cv來的口訣:

清零取反要用與,某位置一可用或

若要取反和交換,輕輕鬆鬆用異或

參考:

c語言中的位運算有什麼優點:

位運算技巧

1.lowbit x 實現 int lowbit int x 這個函式用來求數中二進位制位中最低位的1 完整求法 log2 lowbit x 需要注意的是,答案的範圍是0 30,因為31位是符號位,求出來的值為負數,原因如下 設x 0x8000 0000,那麼設res lowbit x 0x8000...

位運算技巧

數字和1相與 判斷奇偶 x 1 1 奇數 x 1 0 偶數 不用其他空間交換兩值 a a b b a b a a b 或a a b b a b a a b a 0 a a a 0 不用其他空間找陣列中唯一成對的那個數 int b 0 for int i 1 i 10 i int a 10 for i...

位運算技巧

1.或 符號 比較兩個數的每一位,只要有乙個數在這一位上為1,所得的新數在這一位上就為1,否則為0。2.與符號 比較兩個數的每一位,只有兩數這一位同時為1時所得新數為1,否則為0。3.異或 符號 比較兩數的每一位,如果一樣所得新數這一位就是0,不一樣就是1。4.取反 符號 0變1,1變0。5.移位 ...