老早以前就已经见过这道题目了,但是当时只是记住了一个结果,如下:
-
int res = 0;
-
while(n){
-
res++;
-
n=n&(n-1);
-
}
当时看到有这个简单的解法,就直接记住了,没有去理解透彻,现在再看,只是知其然,不知其所以然了,手动抹泪。。。
言归正传,解释一下上述代码,n-1 表示将n二进制表示中最右边的那个1变成0,其后(如果有的话)所有的0变成1,前面所有位不变,n&(n-1)表示的值就是将n二进制表示当中的最右边的那个1去掉的结果,每次循环去掉一个,直到为0,则res最终为所求。
举个栗子:13的二进制表示为1101,执行上述函数:
第一轮:n=1101, res = 1, n = 1100;
第二轮:n=1100, res = 2, n = 1000;
第三轮:n=1000, res = 3, n = 0;
最终res为所求~
阅读(2908) | 评论(0) | 转发(0) |