好玩的位运算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的个数的主要内容,如果未能解决你的问题,请参考以下文章