介紹
一、<< & >>
shl = << (左移) | shr = >> (右移)
shl: 左移 << 用來將一個數的各二進制位全部左移若干位,移動的位數由右運算元指定,右運算元必須是非負值,其右邊空出的位用0填補,高位左移溢位則舍棄該高位 a << b = a* 2^b shr: 右移 >> 右移運算是將一個二進制位的運算元按指定移動的位數向右移動,移出位被丟棄,左邊移出的空位或者一律補0 a << b = a/ 2^b
二、and & or
and(&)(與)(∧) 都是1,取1 or(|)(或)(∨) 有1,就取1 xor(^)(異或) 相同為0,不同為1 10111 ^ 00101 = 10010 ¬ 非 表示取反
應用
一、判斷一個數字X的i位是不是1
方法:
if((1 << (i-1)) & x > 0) 原理: 1左移(i-1)位,相當于制造了一個就i位上是1其他位都是0的一個二進制數,將這個數與X進行“與”運算,如果大于0,則代表第i位是1;否則是0例子: x = 13 (1101)2 i = 3 ∴ 1 << (i-1) = 1 << 2 = 1002 = 01002 (補上0) ∴ (1 << (i-1)) & x = 01002 & 11012 = 01002 因為其0100大于0,所以這i位是1
二、把一個數字二進制下的第i位改成1
方法:
x = x | (1 << (i-1))
原理:
與“一”類似,直接看”例子“吧
例子:
x = 13 (1101)2 i = 2
∴ 1 << (i-1) = 1 << 1 = 102 = 00102
∴ x | (1 << (i-1))
= 11012 | 00102
= 11112
三、把一個數字二進制下的最靠右的第一個1改成0(去掉)
方法:
x = x & (x-1)
原理:
十進制下的數減了1后,二進制下的數最右邊的1肯定會變成0,所以通過“與”一下就可以把最靠右的第一個1改成0
例子:
x = 13 (1101)2
∴ x-1 = 12 = 11002
∴ x & (x-1)
= 11012 & 11002
= 11002
四、回傳二進制最低位1的權值
方法:
x & (-x)
原理:
-x 就是 x 的補碼,會把x二進制各個位上的數字反轉(1 變 0; 0 變 1)再加1
ps: 多位數中,某一位上“i”的值表示該位的權制
如 二進制中 第3位上是數字1, 則該位的權制就等于22 = 4
例子:(這里忽略符號位)
x = 13(1101)2
x & (-x) = 11012 + 00002 + 12 = 110
x = 26(11010)2
x & (-x) = 110102 + 001012 + 12 = 110102 + 001102 = 210
x = 40(101000)2
x & (-x) = 1010002 + 0101112 + 12 = 1010002 + 0110002 = 810
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/63260.html
標籤:C++
