---------------------------------------------
-- 时间:2019-03-21
-- 创建人:Ruo_Xiao
-- 邮箱:xclsoftware@163.com
---------------------------------------------
最近面试时看见这么一道题目,如下:
int Func(int x)
{
int iCount = 0;
while (x)
{
x = x & (x - 1);
iCount++;
}
return iCount;
}
当时真是脑袋一热,让我想起了一首歌:让我欢喜让我忧。欢喜的是这道题目出自《程序员面试宝典》,面试之前看过,忧虑的是当时没弄太明白,只是知道答案……今天好好总结一下。
先说答案吧,返回值为8。该函数的功能是计算x的二进制表达中1的个数。
咱们简单梳理一下过程,假设x = 9999,其二进制是0010 0111 0000 1111,
第1次循环执行时,x = (0010 0111 0000 1111) & (0010 0111 0000 1110),其结果为0010 0111 0000 1110。
第2次循环执行时,x = (0010 0111 0000 1110) & (0010 0111 0000 1101),其结果为0010 0111 0000 1100。
……
第4次循环执行时,x = (0010 0111 0000 1000) & (0010 0111 0000 0111),其结果为0010 0111 0000 0000。
第5次循环执行时,x = (0010 0111 0000 0000) & (0010 0110 1111 1111),其结果为0010 0110 0000 0000。
……
第8次循环执行时,x = (0010 0000 0000 0000) & (0001 1111 1111 1111),其结果为0000 0000 0000 0000。
循环结束!
要点是“&”操作,将“1”和“0”对齐,消除掉,很完美!
(SAW:Game Over!)