位運算小結

2022-04-10 05:42:23 字數 1721 閱讀 8708

聽attack學長講完課,整理一波

\(1|1 = 1,1 | 0 = 1,0|0 = 0\)

\(1\&1=1 ,1 \& 0 = 0,0 \& 0 = 0\)

\(1 \bigoplus 1 = 0,1\bigoplus 0 = 1,0 \bigoplus 0 = 0\)

異或性質

1.\(a \bigoplus a = 0\)

2.\(a \bigoplus 0 = a\)

3.\(a \bigoplus b = b \bigoplus a\)

4.\(a \bigoplus b \bigoplus c = a \bigoplus (b \bigoplus c)\)

\(\sim x\)就是將x在二進位制下的\(0\)變為\(1\),\(1\)變為\(0\)

一般採用的移位方式。

右移時左邊補零,右邊溢位(捨棄)

左移時右邊補零,左邊溢位。

右移時左邊由符號決定。右邊溢位。

左移時左邊溢位(符號位不變),右邊補零。

將溢位的位填補到另一邊。

\(x>>pos \& 1\)

\(x |= (1 << pos),x ^=(1<

\(lowbit(x) = x \& -x\)

可以快速找到x中最後乙個1出現的位置。

正常做法

cin>>x;

cout<<__builtin_popcount(x)<屌絲做法

預處理,\(count[i] = count[i >> 1] + (i \& 1)\)

cin>>x;

for(unint i = 1;i <= 1000000;++i)

count[i] = count[i>>1] + (i & 1);

cout《那如果查詢的數字到了\(10^9\)或者更大怎麼辦。很簡單只要上這個數字前\(16\)的\(count\)+後\(16\)位的\(count\)就行了。

和上面方法類似,先預處理出翻轉\(16\)位後的數字,\(32\)位的將前後分別翻轉即可。

cin>>x;

for(unint i = 1;i <= (1 << 16);++i)

rev[i] = rev[i>>1] | ((i & 1) << 15);

cout<> 16] | (rev[x & ((1 << 16) - 1)] << 16);

可以用lowbit快速找到最後乙個1的位置就就行了。

也可以\(\_\_builtin\_ctz(x)\)

\(\_\_builtin\_clz(x)\)

\(x\&(x ^ (x + 1))\)

for(int i = x;i;i = (i - 1) & x)
設最右邊連續的\(1\)是第\(
位運算小結

當你做乙個非常大的數的乘除運算時,你就會為位運算感嘆,為之驚人的速度而感動!下面是我總結的一點點位運算的應用 位運算子有 按位與 按位或 按位異或 按位取反 優先順序從高到低,依次為 1.左移1位相當於乘以2 左移2位相當於乘以4 依次類推左移n位相當於乘以2 n 注意 兩個運算元必須是int 2....

位運算小結及位運算題目小練

按位與運算子 是雙目運算子。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1,否則為0。參與運算的數以補碼方式出現。運算規則 0 0 0 0 1 0 1 0 0 1 1 1 舉例 9 00001001 5 00000101 1 00000001 00001001 ...

C 位運算子小結

位 與 and 位 異或 位 或 or 位 取反 2 移位運算子 右移 優先順序位 與 位 或 和位 異或 運算子都是雙目運算子,其結合性都是從左向右的,優先順序高於邏輯運算子,低於比較運算子,且從高到低依次為 0 1 0 0 0 0 1 0 0 1 1 1 00100 運算通常用於二進位製取位操作...