计算数值二进制表达式中1的个数
? ? ? ? 最近面試時(shí)看見這么一道題目,如下:
int Func(int x) {int iCount = 0;while (x){x = x & (x - 1);iCount++;}return iCount; }? ? ? ? 當(dāng)時(shí)真是腦袋一熱,讓我想起了一首歌:讓我歡喜讓我憂。歡喜的是這道題目出自《程序員面試寶典》,面試之前看過,憂慮的是當(dāng)時(shí)沒弄太明白,只是知道答案……今天好好總結(jié)一下。
? ? ? ? 先說答案吧,返回值為8。該函數(shù)的功能是計(jì)算x的二進(jìn)制表達(dá)中1的個(gè)數(shù)。
? ? ? ? 咱們簡單梳理一下過程,假設(shè)x = 9999,其二進(jìn)制是0010? 0111? 0000? 1111,
? ? ? ? 第1次循環(huán)執(zhí)行時(shí),x = (0010? 0111? 0000? 1111) & (0010? 0111? 0000? 1110),其結(jié)果為0010? 0111? 0000? 1110。
? ? ? ? 第2次循環(huán)執(zhí)行時(shí),x = (0010? 0111? 0000? 1110) & (0010? 0111? 0000? 1101),其結(jié)果為0010? 0111? 0000? 1100。
? ? ? ? ……
? ? ? ? 第4次循環(huán)執(zhí)行時(shí),x = (0010? 0111? 0000? 1000) & (0010? 0111? 0000? 0111),其結(jié)果為0010? 0111? 0000? 0000。
? ? ? ??第5次循環(huán)執(zhí)行時(shí),x = (0010? 0111? 0000? 0000) & (0010? 0110? 1111? 1111),其結(jié)果為0010? 0110? 0000? 0000。
? ? ? ? ……
? ? ? ??第8次循環(huán)執(zhí)行時(shí),x = (0010? 0000? 0000? 0000) & (0001? 1111? 1111? 1111),其結(jié)果為0000? 0000? 0000? 0000。
? ? ? ? 循環(huán)結(jié)束!
? ? ? ? 要點(diǎn)是“&”操作,將“1”和“0”對齊,消除掉,很完美!
?
(SAW:Game Over!)
與50位技術(shù)專家面對面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的计算数值二进制表达式中1的个数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/Cpp / 设计模式 / 简单工厂模
- 下一篇: 编写一个程序,开启3个线程,这3个线程的