标签:
以后把关于二进制运算编程相关的记录到这里好了。
前段时间小米笔试第一道题:二进制数中一的个数。
解法一:
1 int getnumof1(int n) 2 { 3 int count = 0; 4 whlie (n) { 5 if (n & 1) { 6 count++; 7 } 8 n = n >> 1; 9 return count; 10 }
明显的问题是:如果输入是一个负数, 则会因为符号位‘1’填充左边高位,导致进入死循环,虽然可以进入函数内判断负数并对其进行取绝对值,但显然麻烦。
解法二:
int getnumof1(int n) { int count = 0; unsigned int flag = 1; while(flag) { if (n & flag) { count++; } flag = flag << 1; return count; }
解法二明显健壮了许多,但是32位的长度需要循环32次。还有更好的解法三。
解法三:
int getnumof1(int n) { int count = 0; while (n) { n = (n - 1) & n; count++; } return count; }
这种方法利用了n = n & (n-1) 使最右边的一个‘1’变为‘0’的作用,非常巧妙,有几个‘1’就循环几次。很多问题都可以用这个方法解决。
例如 判断一个数是否是2的整数次方,如果是 则 n & (n - 1) == 0成立。
标签:
原文地址:http://www.cnblogs.com/yangyangup/p/4571958.html