• 《编程之美》2.1 求无符号整数N的二进制表示中1的个数


    题目:求无符号整数N的二进制表示中1的个数

     1 #include <iostream>
     2 
     3 // way1方法类似将10进制数转换为二进制数的过程,
     4 // 如果一个整数对2取模,如果结果为1,代表其最低位为1;
     5 // 然后我们将该整数向右移动一位(即除2)
     6 // 重复此过程,就可以拿到所有1的个数
     7 int way1( unsigned int num )
     8 {
     9     int count = 0; 
    10     while ( num ) {
    11         if ( num % 2 == 1 ) {
    12             count++; 
    13         }
    14         num = num / 2; 
    15     }
    16     return count;  
    17 }
    18 
    19 // way2方法:相当于把取模运算变为了按位与,将除2变为了右移操作,从而提升了效率
    20 int way2( unsigned int num ) 
    21 {
    22     int count = 0; 
    23     while ( num ) {
    24         count += num & 0x01;
    25         num = num >> 1; 
    26     }
    27     return count; 
    28 }
    29 
    30 // way3方法原理如下利用N和(N-1)的二进制表达式的关系,即N&(N-1)就会消除N的二进制中最右边的1。
    31 // 详细说明如下:
    32 // 已知N,求N-1,我们回忆一下,求N-1的二进制的减法过程
    33 // 在N的二进制表示中,从最右边向左找第一个1,然后借位,被借的那个数位1变为0,然后往右返回一个2(二进制,借1当2),右边数位留下一个1,再借给左边的数位一个1,
    34 // 重复此过程,直至最右边的数位。
    35 // 举个例子,比如N=1100(十进制的12),N-1 = 1100 - 1 = 1011 ( 十进制的11)
    36 // 请注意这个过程会产生一个现象,即N-1的二进制表达式和N的二进制表达式,从N的最左边的一个1( 即1[1]00, 被[]括起来的那个1 )开始,数位是完全相反的,
    37 // 而这个被括起来的1的左边,N和N-1是一致的。
    38 // 因此,我们可以利用这个规律,用N&(N-1)(&为按位与)来消除N的最低的一位1,( 1100 & 1011 = 1000 ), 然后将结果赋值给N,
    39 // 如此反复,可以做几次N&(N-1),其二进制中就有几个1
    40 int way3( unsigned int num )
    41 {
    42     int count = 0; 
    43     while ( num ) {
    44         num = num & (num - 1); 
    45         count++; 
    46     }
    47     return count; 
    48 }
    49 
    50 int main( int argc, char** argv )
    51 {
    52     // 求无符号整数num的二进制表示中1的个数 
    53     // 为了方便验证结果,我们直接将整数以二进制形式定义
    54     unsigned int num = 0b101110001; 
    55     std::cout << "num is " << num << std::endl; 
    56     std::cout << "way1 result : " << way1(num) << std::endl; 
    57     std::cout << "way2 result : " << way2(num) << std::endl; 
    58     std::cout << "way3 result : " << way3(num) << std::endl; 
    59 
    60     return 0; 
    61 }
  • 相关阅读:
    python之切片
    python之递归函数
    python之函数的参数
    python之定义函数
    python函数之调用函数
    小地图
    利用脚本对游戏对象进行操作
    Unity中www的基本应用
    U3D脚本开发基础
    U3D游戏开发基础
  • 原文地址:https://www.cnblogs.com/houjianli/p/16258583.html
Copyright © 2020-2023  润新知