求二进制数中的1的个数

原创 2013年12月01日 21:21:59

今天在做深入理解计算机系统的LAB1,其中有道题求二进制数中的1的个数

看到这种算法
int bitCount(int x)
{
    n = (n &0x55555555) + ((n >>1) &0x55555555) ;
    n = (n &0x33333333) + ((n >>2) &0x33333333) ;
    n = (n &0x0f0f0f0f) + ((n >>4) &0x0f0f0f0f) ;
    n = (n &0x00ff00ff) + ((n >>8) &0x00ff00ff) ;
    n = (n &0x0000ffff) + ((n >>16) &0x0000ffff) ;

    return n ;
}
简单分析一下:

例如一个 表达式 n= (1101)( 1001)( 1111)( 1000)( 0001) ...

与上0x55555555,就是取了每个括号的的第二位和第四位,然后((n >>1) &0x55555555)其实就是取了每个括号里的第一位和第三位,相加就实现了将每个括号里的第一位加上第二位,第三位加上第四位,以此类推得到(10)(01)(01)(01)(10)(10)(01)(00)(00)(01)...每两位就代表

1101)(1001)(1111)( 1000)( 0001) 中各个括号中的两位里面的1的个数。接下来与上(n &0x33333333) + ((n >>2) &0x33333333),

大致过程如下:

   (10)(01)(01)(01)(10)(10)(01)(00)(00)(01).

       00        11       00        11          00       11        00        11          即&0x33333333

                  (10)(01)(01)(01)(10)(10)(01)(00)(00).

        00        11        00         11        00        11        00        11          即&0x33333333

  这样相加又会将高的二位与低的二位相加得到表达式n中四个位里面1的个数。0x55555555和0x33333333这些主要是为了取出一块数据。

求二进制数中0或1的个数

求二进制数中0或1的个数
  • fuhuixin7497
  • fuhuixin7497
  • 2017年09月20日 09:50
  • 351

C语言编程之计算二进制数中1的个数

首先我们利用第一种方法,在这我们可以知道,我们从二进制最小位依次往上看。 例如:5的二进制是101,如果它的二进制最小位上是有数值得,这样我们就对他++,否则,我们就进行移位操作,这部操作当然也可以...
  • qq_26768741
  • qq_26768741
  • 2016年03月15日 22:30
  • 3242

二进制下异或运算与二进制数中1个数的奇偶性联系

二进制下异或运算与二进制数中1个数的奇偶性联系,也就是说有三种情况,1.拥有奇数个1的二进制数与拥有奇数个1的二进制数的异或运算。2.拥有奇数个1的二进制数与拥有偶数个1的二进制数的异或运算。3.拥有...
  • zhang_yang_43
  • zhang_yang_43
  • 2017年05月31日 11:57
  • 372

(c语言)求一个二进制数1的个数

问题描述: 输入一个整型数a,计算这个数中在二进制存储方式下1的个数。 程序分析: 1.输入的整型数a在计算机中是以二进制的形式存储,我们采用的方法是逐位判断。 2.当这个数a大于0时,将该数和1相与...
  • live_wyq
  • live_wyq
  • 2015年04月20日 22:37
  • 1065

关于Java的一道题:"求二进制数中1的个数"的解法整理

package com.accp; /**  * 求二进制数中1的个数  *  * @author Administrator  *  */ public class BinaryConversi...
  • u011659172
  • u011659172
  • 2013年12月04日 22:16
  • 2713

Java实现求一个整数的二进制数中1的个数

这题还是笔试的时候遇到的,当时没有想太多,直接用了最为直接的移位相加的方法,虽然可以得出结果,但是程序效率低。 后来发现使用n=n&(n-1)的方法,效率会更高,先上代码。 public stat...
  • wangshuang1631
  • wangshuang1631
  • 2016年10月13日 20:04
  • 2696

快速统计二进制中1的个数(分析篇)

今天做了一道题,发现n&=(n-1)这个式子很好奇,然后试着算了一遍发现它竟然能够快速统计二进制1的个数,特此拿来分享一下。 首先,分析一下该式子,先可以简化为 n=n&(n-1); 我...
  • u013243347
  • u013243347
  • 2016年08月16日 15:12
  • 1612

【C语言】求一个数的二进制中 1 的个数

求一个数的二进制的1的个数
  • LX18792732127
  • LX18792732127
  • 2016年09月19日 11:33
  • 1638

N的二进制中1的个数

解法一: 对于二进制数的操作,我们知道除以一个2,原来的位数将会减少一位,如果除的过程中有余数,那么就表示当前位置有一个1,否则为0。 以10100010为例: 第一次除以2时,商为101000...
  • qq_32175783
  • qq_32175783
  • 2016年05月19日 15:15
  • 918

“平行算法”求二进制数中1的个数

int func(unsigned int i) { unsigned int temp = i; temp = (temp & 0x55555555) + ((temp>> 1) &...
  • hyqsong
  • hyqsong
  • 2016年03月13日 21:40
  • 1601
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:求二进制数中的1的个数
举报原因:
原因补充:

(最多只允许输入30个字)