理解 x&=x-1(2021 CSP-J)

2021年的 CSP-j 初賽又掛掉了
比去年更慘
一題題的來(lái)分析一下吧
第一題是位運(yùn)算題
直接就有點(diǎn)沙雕了

語(yǔ)句:for (; x; x &= x - 1) ret++; 題解說(shuō)這個(gè)ret 記錄的就是 x的二進(jìn)制表示中 1 的個(gè)數(shù),為什么呢?

分析:

功能:將x轉(zhuǎn)化為2進(jìn)制,看含有的1的個(gè)數(shù)。
每執(zhí)行一次x = x&(x-1),會(huì)將x用二進(jìn)制表示時(shí)最右邊的一個(gè)1變?yōu)?,因?yàn)閤-1將會(huì)將該位(x用二進(jìn)制表示時(shí)最右邊的一個(gè)1)變?yōu)?。

當(dāng)二進(jìn)制數(shù)減1時(shí),處在最后的一個(gè)位會(huì)減少1,
如果這位本身就是1,那么直接變成0:如10101-->10100;
但如果最后一個(gè)是0,那么套用從上一位借一個(gè)的原則:如10100-->10011;

到這里發(fā)現(xiàn),相當(dāng)于從右往左的第一個(gè)1會(huì)讓剩下的所有0再變成1;相當(dāng)于把這一個(gè)減的操作從這一個(gè)1處截?cái)唷?yīng)為當(dāng)前是0時(shí)只會(huì)往上一個(gè)1位去借,那么這一位是1時(shí)往下借,后面一定全部是0;然后我們進(jìn)行和原來(lái)一個(gè)數(shù)的與操作,就會(huì)使得這一個(gè)1連同其后的所有位變成0,而更高的位數(shù)不會(huì)受到影響;

so,一次消去一個(gè)1,從右到左消去所有,就實(shí)現(xiàn)了計(jì)算總數(shù)。

每次循環(huán),執(zhí)行一次x = x&(x-1),會(huì)將x用二進(jìn)制表示時(shí)最右邊的一個(gè)1變?yōu)?,同時(shí)count計(jì)數(shù)加1,直到x為0。每次執(zhí)行x = x&(x-1),假設(shè)x的二進(jìn)制最右邊的1在第k位,則其第0 ~ 1-k位全部為0。而x-1,則是第 0 ~ 1-k位全部變?yōu)?,而第k位為0。二者按位與,則第0 ~ k位全部變?yōu)?。

利用x&(x-1)表達(dá)式,還可以用來(lái)判斷一個(gè)數(shù)(x)是否是2的n次方。如果一個(gè)數(shù)是2的n次方,那么這個(gè)數(shù)用二進(jìn)制表示時(shí)其最高位為1,其余位全部為0。用程序表示如下:

int func(int x)
{
    if( (x&(x-1)) == 0 )
        return 1;
    else
        return 0;
}

完結(jié)!

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

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

  • 與、或、非、位移 原碼、反碼、補(bǔ)碼 字節(jié)、位、超區(qū)間...... 開(kāi)始本章節(jié)之前,我們先思考一個(gè)問(wèn)題: byte ...
    墨雨軒夏閱讀 464評(píng)論 0 1
  • 轉(zhuǎn)自:https://www.cnblogs.com/xmphoenix/archive/2011/10/23/2...
    shellroot閱讀 1,644評(píng)論 0 0
  • 如何通過(guò)位運(yùn)算巧解編程題 概念 位運(yùn)算是一種針對(duì)于小于一個(gè)字節(jié)數(shù)據(jù)進(jìn)行的數(shù)學(xué)運(yùn)算。計(jì)算機(jī)編程中,需要進(jìn)行位運(yùn)算的操...
    BoosterChen閱讀 796評(píng)論 0 4
  • 咱們本篇文章講的語(yǔ)法不多,因?yàn)檎Z(yǔ)法已經(jīng)有很多文章可以參考學(xué)習(xí),本篇主要講的是怎么去理解匯編。 首先了解計(jì)算機(jī)結(jié)構(gòu) ...
    黑色螞蟻_MGL閱讀 2,943評(píng)論 0 3
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭,有人歡樂(lè)有人憂愁,有人驚喜有人失落,有的覺(jué)得收獲滿滿有...
    陌忘宇閱讀 8,814評(píng)論 28 54

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