對於位運算完全不熟悉,因此開個小記來陸續記錄一些遇到的常用位運算
```&```:按位與,對應的二進位制位均為1時返回1,否則返回0;
```|```:按位或,對應的二進位制位有乙個為1時返回1,否則返回0;
```^```:按位異或,對應的二進位制位不同時返回1,否則返回0;
```~```:按位非,對每一位取反;
```<<```:左移;
```>>```:右移;
##位運算的一些技巧
###```i<>j```
前者表示i的二進位制表示左移j位,等效於i/(2^j);後者表示i的二進位制表示右移j位,等效於i*(2^j);
###i&1
求i的最後一位,可判斷奇數偶數;
###i^j
比較i與j的每一位,不同時返回1,否則返回0;因此i==j時,i^j=0;
###i&(-i)
返回 i 的二進位制數表示為1的最低位的權值,如1001則返回1,1100則返回4,1110則返回2;該運算常用於求和或更新樹狀陣列
###i&(i-1)
使i二進位制表示下最右邊的1變為0;
因此:①可以用i&(i-1)的結果是否為0來判斷i是否是2的冪;
②如果要比較m,n的二進位制表示有多少位不同,可以
```c++
int n,m,t,cnt=0;
cin >> n>>m;
t = n ^ m;
while (t)
cout << cnt;
```n^m的結果將n與m的不同位變為1,相同位變為0,因此只需統計t有多少個1;
用t&(t-1)來依次將t最右邊的1改為0,直到t為0;操作的次數即為1的個數。
由此統計m,n不同位的個數
###i+((i+1)&(-(i+1)))
i+1將i最低位的0變為1,後面的1變為0,再用(i+1)&-(i+1)取得其最低位1的權值,加到i上,得到的效果就是將i最低位的0變成1
###異或運算的一些性質
異或運算的逆運算也是異或運算,即:a^b=c,則有a=b^c;
異或運算具有結合律,因此a^b^b=a
一些位運算
該篇文章會持續更新將遇到的位運算在這進行解釋 1.按位與 運算 運算規則 0 0 0 0 1 0 1 0 0 1 1 1 例如 8的二進位制 00001000 5的二進位制 00000101 8 5 0000 0000 轉換成十進位制就是0 與運算 的特殊用途 1 清零。如果想將乙個單元清零,即使其...
位運算的一些操作
按位與 操作通常用作將乙個數的某些位清零或保留某些位操作 例如 把a的高8位清零 a 0000000011111111 也就是將a 255操作之後,就會實現將數字a的高8位位清零了 異或 操作的用途 將某些特定的位翻轉 例如對數0x10100001的第2和第3位翻轉操作,那麼 可以0x1010000...
位運算的一些基本操作
原部落格 一 邏輯運算子 1.位與運算 1 運算規則 位與運算的實質是將參與運算的兩個資料,按對應的二進位制數逐位進行邏輯與運算。例如 int型常量4和7進行位與運算的運算過程如下 4 0000 0000 0000 0100 7 0000 0000 0000 0111 0000 0000 0000 ...