好玩的位运算5:数字中1的个数

Posted 纵横千里,捭阖四方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了好玩的位运算5:数字中1的个数相关的知识,希望对你有一定的参考价值。

这个问题也是位运算的经典问题:给定一个无符号32位整数num,求num的二进制表示法中含1的个数?

在解答这个问题之前,我们先看个变种,如果要统计十进制中数字1的个数该如何做呢?最简单的方式是使用除和取模循环操作,并且计数,也就是这样:

public int countDigitOne(int n) 
        int cnt = 0;
        for(long i = 1; i <= n; i*=10)
            int a = n /i;
            int b = n % i;
            cnt += (a%10 == 1) ? (a/10)*i + b+1 : (a+8)/10*i;
        
        return cnt;
    

这是一种比较常规的方法,如果将题目换成无符号位的整数,并且让你求二进制位中1的个数呢?很显然这时候按照上面的方式有点复杂,而且效率不高。这里可以使用位运算来处理

public int countDigitOne(int digital)

int count=0;
for(int i=0;i<32;i++)
//一边移动,一边比对
  if((N&&(1<<i))==(1<<i))
    count ++;
    


return count;

这里我们是数字不变,移动1,也可以数字不断向右移位,只比较最后一位是不是1。

以上是关于好玩的位运算5:数字中1的个数的主要内容,如果未能解决你的问题,请参考以下文章

ACM中的位运算技巧

好玩的位运算4:如果用二进制表示小数

好玩的位运算3: 将整数的奇偶位互换

好玩的位运算2:用一条语句判断一个整数是不是2的整数次方

深入研究js中的位运算及用法

2021/5/27 刷题笔记汉明距离与python的位运算符