题目描述:请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。
例如: 9 表示成二进制是 1001, 有 2 位是 1 。因此如果输入 9 ,该函数输出 2 。
先看一种错误的解法:
int NumberOf1(int n) { int count = 0; while(n) { if(n & 1) count ++; n = n >> 1; } return count; }
注意:在使用乘法或者除法的运算时,尽量使用移位运算代替,因为移位运算的效率要比乘除法高很多!
上述解法的问题在于:输入一个正数,结果没有问题,但是,如果输入一个负数的话,会发生什么情况?
我们知道,负数的二进制的最高位为 1 ,当进行右移操作时,最高位要补上符号位也就是 1 ,因此每右移一位,最高位就补 1 ,最终这个数字就会变成0xFFFFFFFF,而陷入死循环。
常规解法
int NumberOf1_Solution1(int n) { int count = 0; unsigned int flag = 1; while(flag) { if(n & flag) count ++; flag = flag << 1; } return count; }
此解法中循环的次数等于整数二进制的位数,32位的整数需要循环32次。
高效的解法
int NumberOf1(int n) { int count = 0; while (n) { ++ count; n = (n - 1) & n; } return count; }
该解法在整数中有几个 1 就只需要循环几次。
相关题目
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。