c++中位操作操作符
| 符號 | 描述 | 規(guī)則 | |
|---|---|---|---|
| & | 按位取與 | 有0得0 | |
| 按位取或 | 有1得1 | ||
| ^ | 異或 | 不同得1 | |
| ~ | 取反 | 01顛倒 | |
| << | 左移 | 向左移動后面的位數(shù),溢出拋棄,添零補(bǔ)位 | |
| >> | 右移 | 右移后面的位數(shù),移出拋棄,添零補(bǔ)位 |
這些位操作符只能用于整形的操作,其他會編譯報(bào)錯。
位操作符的運(yùn)算優(yōu)先級比較低,因?yàn)楸M量使用括號來確保運(yùn)算順序。
另外位操作還有一些復(fù)合操作符,如&=、|=、^=、<<=、>>=。
常用位操作技巧
判斷奇偶
// 取最后一位,判斷是1則為奇數(shù),是0則為偶數(shù)。
int judge(int a)
{
return a & 1;
}
交換數(shù)字
// a=(a^b)^(a^b)^b=b
// b=(a^b)^b=a
void swap(int &a, int &b)
{
if (a != b)
{
a ^= b;
b ^= a;
a ^= b;
}
}
變換符號
取反加1
A = (~A) +1;
求絕對值
\\ 先判斷正負(fù)再變換符號
\\ 判斷正負(fù)根據(jù)數(shù)字的第一位是1則為負(fù)
if (a >> 32)
{
a = (~a) + 1
}
無+-號計(jì)算加法
// 首先取ab的與和異或,與表示都為1的位,若不為零,則需要進(jìn)位。
// 異或中不同為1,相同為零,效果與加法相似,只是沒有進(jìn)位。
// 若有進(jìn)位在異或結(jié)果上加上與的結(jié)果左移一位的結(jié)果即可。
int sum(int a, int b)
{
int c = a & b, d = a ^ b;
return c == 0 ? d : sum(d, c << 1);
}
高底位交換
// 左移加右移。假設(shè)是16位數(shù)字。
a = (a << 8) | (a >> 8)
統(tǒng)計(jì)1的個數(shù)
// 假設(shè)對于16位數(shù)字
// 相鄰兩個1位相加
a = ((a & 0xAAAA) >> 1) + ((a & 0x5555))
// 相鄰兩個2位相加
a = ((a & 0xCCCC) >> 2) + ((a & 0x3333))
// 相鄰兩個4位相加
a = ((a & 0xF0F0) >> 4) + ((a & 0x0F0F))
// 相鄰兩個8位相加
a = ((a & 0xFF00) >> 8) + ((a & 0x00FF))
// 最后得到的數(shù)字就是1的個數(shù)
二進(jìn)制數(shù)字翻轉(zhuǎn)
// 假設(shè)對于16位數(shù)字
// 相鄰兩個1位交換
a = ((a & 0xAAAA) >> 1) | ((a & 0x5555) << 1)
// 相鄰兩個2位交換
a = ((a & 0xCCCC) >> 2) | ((a & 0x3333) << 2)
// 相鄰兩個4位交換
a = ((a & 0xF0F0) >> 4) | ((a & 0x0F0F) << 4)
// 相鄰兩個8位交換
a = ((a & 0xFF00) >> 8) | ((a & 0x00FF) << 8)