快速计算整数的二进制表示法中1的个数

快速计算整数的二进制表示法中1的个数

题目:给定一个无符号32位整数x,求x的二进制表示法中含1的个数?

第一种算法:

int OneCount(unsigned int x)
{
  for(int count=0; x>0; count++)
    x&=x-1;//把最后面的1变0
  return count;
}


 上面算法的时间复杂度就是1的个数。

第二种算法(查表法):

const int idx[256]={0,1,1,,8}//0~255中含1的个数
int OneCount(unsigned int x)
{
  int count=0;
  for(; x>0; x>>=8)
     count+=idx[x&255];
  return count;
}

上面算法最多只需要4次循环,用空间换取时间。

第二种算法的另一种形式:

const int idx[256]={0,1,1,..,8}
int OneCount(unsigned int x)
{
  unsigned char* p=(unsigned char*)&x;
  return idx[*p]+idx[*(p+1)]+idx[*(p+2)]+idx[*(p+3)];
}


第三种算法:

int OneCount(unsigned int x)
{
  x=(x&0x55555555UL)+((x>>1)&0x55555555UL); //1
  x=(x&0x33333333UL)+((x>>2)&0x33333333UL);//2
  x=(x&0x0f0f0f0fUL)+((x>>4)&0x0f0f0f0fUL); //3
  x=(x&0x00ff00ffUL)+((x>>8)&0x00ff00ffUL); //4
  x=(x&0x0000ffffUL)+((x>>16)&0x0000ffffUL);//5
  return x;
}

解释:比如对于一个8位的整数122,用二进制表达0111 1010(abcd efgh),第1行代码的功能是x=0b0d 0f0h+0a0c 0e0g,两位一组,分别计算四组(a,b; c,d; e,f; g,h; )中1的个数,本例中x=0101 0000+0001 0101=0110 0101(更新的abcd efgh),在此基础上,再分组,就是第二行的功能x=00cd 00gh+00ab 00ef,四位一组(abcd; efgh),分别计算这两组包含1的个数,本例中x=00100001+0001 0001=0011 0010(更新abcd efgh),再8位一组,如第三行所示,x=0000 efgh+0000abcd=0000 0010+0000 0011=0000 0101=5,所以该整数122共包含5个1。

本算法思想:归并,对于一个32位的整数,先分成16组,统计每组(2位)中1的个数,再将统计的结果两两合并,得到8组,在此基础上又合并得到4组,2组,1组,进而得到最终结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/243273.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对任务和函数的改进

对任务和函数的改进 1、任务和函数的隐式语句组 SystemVerilog会推断出begin…end SystemVerilog简化了任务和函数的定义,有多条语句时不在需要begin …end对多条语句进行打包。打包省略之后,任务或函数中的语句将会顺序执行,就像仍然在begi…

RAPI简单说明及Sample Code

RAPI简单说明及Sample Code 一.什么是RAPI RAPI用来通过ActiveSync来建立PC与Device的通信。通过RAPI可以实现PC 对Device的控制和同步。 二.使用说明 常用的RAPI包括File I/O的一些操作,以及获取系统信息的一些API。 在使用RAPI来建立PC与…

在C/C++代码中使用SSE等指令集的指令(1)介绍

http://blog.csdn.net/gengshenghong/article/details/7007100我们知道,在C/C代码中,可以插入汇编代码提高性能。现在的指令集有了很多的高级指令,如果我们希望使用这些高级指令来实现一些高效的算法,就可以在代码中嵌入汇编&…

递增和递减操作符

递增和递减操作符 和- -操作符 for(i 0;i < 31; i) begin... end先加与后加 通常原则是&#xff0c;对组合逻辑使用阻塞赋值&#xff0c;而对时序逻辑赋值使用非阻塞赋值。 注意&#xff1a;和--操作符是阻塞赋值i;//使用阻塞赋值对i进行递增 ii1;//使用阻塞赋值对i进行…

User Mode Driver Management介绍(一)

User Mode Driver介绍 Windows CE 6.0中引入了User Mode Driver的概念&#xff0c;可是无论是网上&#xff0c;还是各个芯片厂商提供的方案中&#xff0c;都很少提及这方面的内容。 本文以小郭对存储管理和User Mode Driver Host的理解为基础&#xff0c;结合具体的代码实现&am…

CString内存泄露

经常见到 unicode 设置不一致造成内存泄露。。。

赋值操作符

赋值操作符 和其他赋值操作符 out in;//将out和in相加并将结果赋值给out //out out in;注意&#xff1a;这些操作符都是阻塞赋值packdage definitions;typedef enum logic[2:0] {ADD,SUB,MULT,DIV,SL.SR} opcode_t;typedef enum logic{UNSIGNED,SIGNED}operand_type_t;typ…

SolidGraph CAD System

http://www.codeproject.com/Articles/15554/SolidGraph-CAD-System

User Mode Driver Management 介绍(二)

&#xff08;接上一篇&#xff09; 3> 调用User Mode Driver Host API来将Driver Load到内存 CeFsIoControl()实际上是一个对文件系统驱动FSD进行操作的函数&#xff0c;需要传入文件夹名字和IoControlCode。 帮助文档中对该函数的解释如下&#xff1a; This function send…

有无关通配符的相等操作符

有无关通配符的相等操作符 逻辑相等操作符 条件相等操作 SystemVerilog通配符相等操作符允许屏蔽某些位 SystemVerilog还增加了两个新的比较操作符&#xff1a; &#xff1f; 和&#xff01;&#xff1f;。这两个操作符允许在比较中屏蔽无关位。 操作符 &#xff1f;&#x…

cab文件介绍及制作方法

转自&#xff1a;http://bbs.pcpop.com/091030/5945399.html 1. 什么是cab文件 CAB在电脑上是一种压缩文件&#xff0c;微软出品的东西&#xff0c;用WinRAR可以解压缩&#xff0c;在DOS启动盘里面可以看见一些CAB压缩文件。其实Windows里面已经带了CAB压缩程序&#xff0c;但…

设置成员操作符--inside

设置成员操作符–inside SystemVerilog增加了一个检测是否集合中–员的操作符&#xff0c;这个操作符的关键字是inside。 logic [2:0] a; if(a inside{3b001,3b010,3b100}) //等价if((a3b001)||(a3b010)||(a3b100)) ...使用inside操作符可以方便的比较一个数值和多个可能值之…

CVE-2015-0235: GHOST – A Critical Vulnerability in the Glibc Library

GHOST is a ‘buffer overflow’ bug affecting the gethostbyname() and gethostbyname2() function calls in the glibc library. If a remote attacker can make an application call to gethostbyname() or gethostbyname2(), this vulnerability allows the remote attack…

开发库 C++

C/C 开发库 | C/C Development Library 这里收集一些著名的 C/C 开发库、SDK、类库、可复用类与结构代码 等信息&#xff0c;列举它们的介绍、参考和网站链接&#xff0c;为各位 C/C 程序员和爱好者提供检索和查阅类库的方便 下面收集的 C/C 类库介绍整理来源于文章&#xff1a…

VS2005与Device通过ActiveSync连接异常的常见原因

VS2005与Device通过ActiveSync连接异常的常见原因 很多人都碰到过VS2005与Device之间不能够通过ActiveSync进行连接的问题&#xff0c;中间报出来的错误也是形形色色。 根据自己碰到过的原因&#xff0c;我总结了一下&#xff1a; 一&#xff0e;VS2005与Device的连接方式错误…

操作数改进

操作数改进 1、两态和四态类型数据的运算 全两态类型的运算使用Verilog运算法则 Verilog对大多数操作数类型的混合运算都制定了相应规则。 SystemVerilog包含了Verilog没有涉及的两态类型数据的运算&#xff0c;从而对这些规则进行了扩展。对SystemVerilog新类型的运算按照相同…

通过ap运行cab安装程序的方法及Sample Code

1. 第一部分&#xff1a;Sample Code 这部分转自&#xff1a;http://blog.csdn.net/hhygcy/archive/2009/05/04/4147870.aspx 最近这个东西很多被问及&#xff0c;软件动态升级的时候可能可以用到&#xff0c;在这里做一下记录。 就知道的方法有2个&#xff0c; 一个是通过Sh…

MFC透明桌面flash金鱼

代码&#xff1a; http://download.csdn.net/detail/hemmingway/6823935 使用方法&#xff1a; //0,添加left.png&#xff0c;right.png资源文件 //1, 头文件定义变量 GoldFish pet; //2, 在CPP文件创建 // Create a goldfishif (!pet.Create(NULL, NULL, WS_CHILD | WS_VISIB…

改进的for循环

改进的for循环 声明局部循环变量 SystemVerilog简化了声明用于for循环的局部变量的方法。SystemVerilog可以在for循环内部声明循环变量。这样就不需要在模块级定义多个变量&#xff0c;也不用在命名的begin…end块中定义局部变量了。 module chip(...);//SystemVerilog风格的…

程序员们请别做下一个小贝

据网友提供的《蜗居》第24集3:30秒截图&#xff0c;有理由相信小贝是搞 C 的 那本书是《大规模C程序设计》 -- 历史上一定有那么一些人&#xff0c;没有名&#xff0c;没有钱&#xff0c;只是和爱人一起过完了一生。他们不用思念&#xff0c;不用写情话。他们的情话&#xff0c…