码迷,mamicode.com
首页 > 其他好文 > 详细

二进制运算新发现

时间:2015-06-12 17:08:59      阅读:94      评论:0      收藏:0      [点我收藏+]

标签:

以后把关于二进制运算编程相关的记录到这里好了。

  前段时间小米笔试第一道题:二进制数中一的个数。

  解法一:

 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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!