• 《编程之美》二进制中1的数目


    http://blog.csdn.net/hitwhylz/article/details/10122617
    
    
    看到这种要计算二进制什么鬼的,就自然而然想到用位运算
    
    
    //二进制中1的个数
    #include <iostream>
    using namespace std;
    int main()
    {
     int num,count=0;
     cin>>num;
     while(num!=0)
     {
      /*
      1、
      count += n&1;
      num>>=1;
      */
    
      /*
      2、
      //count += n%2;
      //num/=2;
      */
    
      //3、
      num &= num-1;
      count++;
     }
     cout<<count;
     return 0;
    }
    
    
    
    //第一种方法:
    int Hamming_weight_1( int n )
    {
        int count_ = 0; //声明计数变量
    
        while ( n != 0 )  //遍历
        {
            if( n%2 == 1 ) //满足尾数是1.
                count_++;
            n /= 2;        //除2,右移一位。(二进制)
        }
        return count_;
    }
    /*
    上下两种方法其实是一样的,只不过下面一种是用位运算来代替算术运算
    第二种(位运算):
    例子:
    100&001=0
    10&01=0
    1&1=1
    */
    //Hamming_weight算法1---逐个数(位运算)
    int Hamming_weight_1( int n )
    {
        int count= 0; //声明计数变量
    
        while ( n != 0 )  //遍历
        {
            count+= n & 1; //尾数按位与1
            n >>= 1;   // 右移一位
        }
        return count;
    }
    /*
    第三种方法:(也是位运算)
    
    number&= number-1 -----只与二进制中1的位数相关的算法
    
    拿7(111)来做例子,
    第一次 111&110=110,这次操作成功的把从低位起第一个1消掉了,同时计数器加1。
    第二次110&101=100,同理又统计了高位的一个1,同时计数器加1。
    第三次100&011=000,同理又统计了高位的一个1,同时计数器加1。
    此时n已变为0,不需要再继续了,于是111中有3个1。
    */
    
    //二进制中1的个数
    #include<stdio.h>
    //Hamming_weight算法二---只考虑1的位数
    int Hamming_weight_2( int number )
    {
        int count_ = 0; //声明计数变量
    
        while ( number != 0 )  //遍历
        {
            number &= number-1;
            count_ ++;
        }
        return count_;
    }
    
    int main()
    {
        int n;
        while ( scanf("%d", &n) != EOF )  //读入整数和打印1的个数
        {
            printf("%d 
    ", Hamming_weight_2( n ));
        }
        return 0;
    }
  • 相关阅读:
    面试中你能做到随机应变吗? 沧海
    QQ只是一场意外 沧海
    面 试 中 要 慎 言 沧海
    你会应对这些面试题吗? 沧海
    面 试 小 技 巧 沧海
    面试抓住最初三分钟至关重要 沧海
    面试的十二种高级错误 沧海
    几种有难度的面试 沧海
    面试技巧: 轻松过关10种方法 沧海
    面 试 细 节 一 点 通 沧海
  • 原文地址:https://www.cnblogs.com/tianjintou/p/4575039.html
Copyright © 2020-2023  润新知