面试官都喜欢看到的答案之求一个整形数字二进制序列中1的个数**

求一个整形数字二进制序列中1的个数

1. 第一种方法:
.
利用for循环实现,一个整形数有32个比特位,先用这个整形数字和1按位与就可以判断最后一位比特位是1还是0;

         例如:int 15 的二进制:00000000000000000000000000001111
              和1二进制按位与   00000000000000000000000000000001
              结果             00000000000000000000000000000001
               所以可以判断最后一位比特位为1.
         然后把整形数向有移一位,用“>>”表示;在最高比特位添0.
               即15>>1 ,得到: 00000000000000000000000000000111
         然后继续执行上一步操作:先和1按位与,再移位。
         在这里就可以用for循环来执行;for(i=0;i<32:i++)
         再加个if判断语句,判断如果按位与结果是1,统计数字count+1就可以完成。
         **程序如下:**
#include<stdio.h>
int count_one_bit(int n)
{
    int i = 0; 
    int count = 0;
    for (i = 0; i < 32; i++)
    {
        if (((n >> i) & 1) == 1)
            count++;
    }
    return count;
}
int main()
{
    int num = 0;
    int ret = 0;
    scanf("%d", &num);
    ret = count_one_bit(num);
    printf("%d\n", ret);
    return 0;
}
  • 运行结果
    • 这里写图片描述

      这里写图片描述
      然而在这个程序中,不管你有多少个1都需要程序跑完方可停止,这样就导致程序运行的速度比较慢。所以就想有一个更优化的程序,有几个1就执行几次。

    2.第二种方式

    这种方式是借助一个神奇的表达式:n=n&(n-1)
    这个表达式可以将整形数n二进制中1的个数减少一个,所以可以不用for循环,用一个while语句即可。
    在while语句中嵌套 n=n&(n+i)就是主要思路;

 while (n)
    {
        count++;
        n = n&(n - 1);
    }   
   用while判断n中1的个数是否为零,如果不为零就继续执行while,给统计数字加1;如果为零就结束循环,输出count。

   **程序如下**
#include<stdio.h>
int count_one_bit(int n)
{
    int count = 0;
    while (n)
    {
        count++;
        n = n&(n - 1);
    }
    return count;       
}
int main()
{
    int num = 0;
    int ret = 0;
    scanf("%d", &num);
    ret = count_one_bit(num);
    printf("%d\n", ret);
    return 0;
}

- 运行结果

这里写图片描述

这里写图片描述

3.总结

   显而易见,如果面试,面试官更钟情于第二种,因为第二种执行速度更快更优化。  

猜你喜欢

转载自blog.csdn.net/yulong__li/article/details/81089790