位操作

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)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容