快速计算整数的二进制表示法中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,一经查实,立即删除!

相关文章

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

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

赋值操作符

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

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

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

cab文件介绍及制作方法

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

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…

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

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

MFC透明桌面flash金鱼

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

天才静之

木心说:“最高一层天才,是早熟而晚成的。”我一直认为静之就是一个天才。天才不同于才子,才子早熟,但往往短命,而静之却常胜不衰,愈“老”弥坚。 从诗歌、散文到小说,从电视剧、电影再到话剧、歌…

“象征界”的奇观:刘天怜花鸟工笔作品印象

有人说:“创新”是西洋画的基调,中国画的焦点是“承传”。就是说,西画必须花样翻新,挑战前人,甚至要推倒重来,唯此才可能在艺术史上占有一席之地;中国画强调以古人为师,重视师徒之间…

亚马逊正式发布关系型数据库Amazon Aurora

在去年的AWS re:Invent大会上,亚马逊宣布了Amazon Aurora。Aurora是一个关系型数据库,可以跨3个可用区域复制6份数据,其设计目标是提供高性能和高可用性(99.99%),并且存储可以轻松高效地扩展到64TB。近日&a…

刘小东的“空城记”

刘小东的“空城记” 。从“三峡移民”到“金城小子”,从“温床”,再到"新疆和田 ”,今天,刘小东又把“鄂尔多斯” 纳入自己介入现实的创作计划。鄂尔多斯,一个中国曾经最贫瘠的所在,因为矿产开发,迅…

聆听南音

北京。半木空间。聆听南音古曲。 南音亦称弦管、南乐。起于晋唐,盛于南宋,至今流传于泉州闽南地区。被誉为“中国音乐史上的活化石” 。今晚,南音传人蔡雅艺率三位南音大师现场演出、宣讲并与"半木"品牌创始人吕永中先生对话交流…

远程管理 KVM 虚机 - 每天5分钟玩转 OpenStack(5)

上一节我们通过 virt-manager 在本地主机上创建并管理 KVM 虚机。其实 virt-manager 也可以管理其他宿主机上的虚机。只需要简单的将宿主机添加进来 填入宿主机的相关信息,确定即可。 接下来,我们就可以像管理本地虚机一样去管理远程宿主机上的虚机了。 …

KVM 存储虚拟化 - 每天5分钟玩转 OpenStack(7)

KVM 的存储虚拟化是通过存储池(Storage Pool)和卷(Volume)来管理的。 Storage Pool 是宿主机上可以看到的一片存储空间,可以是多种类型,后面会详细讨论。Volume 是在 Storage Pool 中划分出的一块空间&…

LVM 类型的 Storage Pool - 每天5分钟玩转 OpenStack(8)

LVM 类型的 Storage Pool 不仅一个文件可以分配给客户机作为虚拟磁盘,宿主机上 VG 中的 LV 也可以作为虚拟磁盘分配给虚拟机使用。 不过,LV 由于没有磁盘的 MBR 引导记录,不能作为虚拟机的启动盘,只能作为数据盘使用。 这种配置下…

UltraEdit中高亮显示verilog HDL关键词

UltraEdit是一款功能强大的文本编辑器,可以编辑文字、Hex、ASCII码,可以取代记事本,内建英文单字检查、C 及 VB 指令突显,可同时编辑多个文件,而且即使开启很大的文件速度也不会慢。是一个使用广泛的编辑器&#xff0c…

CCS的基本操作

CCS的基本操作 1、 创建新工程 方法一: 方法二: 进入工程界面后,第一步选择芯片型号,第二步选择仿真器,第三步编写工程名称,选择工程模板。最后点击finish 2、 编译 方法一: 方法二&…

KVM 网络虚拟化基础 - 每天5分钟玩转 OpenStack(9)

网络虚拟化是虚拟化技术中最复杂的部分,学习难度最大。 但因为网络是虚拟化中非常重要的资源,所以再硬的骨头也必须要把它啃下来。 为了让大家对虚拟化网络的复杂程度有一个直观的认识,请看下图 这是 OpenStack 官网上给出的计算节点&#…

云计算与 OpenStack - 每天5分钟玩转 OpenStack(14)

“云计算” 算是近年来最热的词了。现在 IT 行业见面不说这三个字您都不好意思跟人家打招呼。 对于云计算,学术界有各种定义,大家有兴趣可以百度一下。 CloudMan 这里主要想从技术的角度谈谈对云计算的理解。 基本概念 所有的新事物都不是突然冒出来的&a…

OpenStack 架构 - 每天5分钟玩转 OpenStack(15)

终于正式进入 OpenStack 部分了。 今天开始,CloudMan 将带着大家一步一步揭开 OpenStack 的神秘面纱。 OpenStack 已经走过了 6 个年头。 每半年会发布一个版本,版本以字母顺序命名。现在已经到第 12 个版本 Liberty(字母 L)。 Op…