`

快速计算整数的二进制表示法中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=0010 0001+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组,进而得到最终结果。
分享到:
评论

相关推荐

    C++计算一个数字的二进制中0或1的个数原理及代码

    在计算机科学中,二进制表示法是基础之一,它不仅被用于数据存储,还在算法设计、加密技术以及系统优化等多个方面发挥着重要作用。本篇文章将详细探讨如何使用C++来计算一个整数在二进制表示中0或1的个数,并深入...

    (android demo)算法实现:计算十进制数N的二进制形式中包含数字1的个数

    在Android开发中,我们经常会遇到各种算法挑战,其中之一就是如何计算一个十进制数N的二进制表示中“1”的个数。这个任务看似简单,但其实涉及到计算机科学的基础知识,包括二进制转换、位操作以及算法设计。下面...

    求二进制数中1的个数

    对于一个字节(8bit)的变量,我们需要求出其二进制表示中“1”的个数。在实际应用中,根据不同的存储空间和效率要求,这个问题可能有不同的解答策略。本文将探讨四种不同的解决方案,并对每种方法的优缺点进行分析...

    求二进制数中1的个数.pdf

    对于一个字节(8位)的变量,求其二进制表示中“1”的个数是一个常见的问题。这一问题不仅出现在计算机科学的基础课程中,也是很多编程竞赛和技术面试中的经典题目。解决这类问题的目标通常是为了提高算法的执行效率...

    课程设计-统计一个数二进制表示中1的个数

    在C语言中,统计一个整数二进制表示中1的个数,有多种方法: 1. **逐位检查法**:最直观的方法是通过循环遍历每一位,判断每一位是否为1。对于32位整数,我们可以用一个for循环检查32次,但这种方法效率较低。 ```...

    BURmoon#CPP_notes#[位运算]二进制中1的个数1

    题目输入一个整数,输出该数32位二进制表示中1的个数(其中负数用补码表示)示例输入输出题解二进制移位法//将 mark0x01 和 n 进行 ‘&’ 运算//

    二进制乘法多种方式 C语言

    例如,要计算`x`乘以`y`,我们可以将`x`左移`y`的二进制表示中的1的个数,并使用按位与运算符(`&`)来累加结果: ```c int multiply(int x, int y) { int result = 0; while (y > 0) { if (y & 1) { // 如果y...

    经典面试题(1):统计整数中1的个数

    本题“经典面试题(1):统计整数中1的个数”是一个典型的例子,其核心是计算一个无符号32位整数在二进制表示下含有多少个1。这个问题在计算机科学中被称为“位操作”或“计数比特”的问题,涉及到位运算、循环以及...

    算法-权势二进制(51Nod-1413).rar

    例如,这个问题可能要求我们编写一个程序,输入一个整数,然后返回它的二进制表示中1的个数,也就是它的“权势”。 位操作是计算机科学中一个基础但强大的工具,它允许我们高效地对数字进行操作。在二进制表示下,...

    算法-数1的个数(信息学奥赛一本通-T1095).rar

    5. **数学公式法**:对任意正整数n,其二进制表示中1的个数等于n与(n-1)的与操作后的二进制表示中1的个数加上1。这是因为n与(n-1)会将n的所有最右边的1变成0,而剩下的1的数量是n的二进制表示中1的个数减1。 通过...

    php实现统计二进制中1的个数算法示例

    给定一个十进制整数,目标是输出其二进制表示中1的个数。如果输入的数字为负值,则应考虑使用补码表示。 **解决思路** 1. **按位与操作法**(解法一) 这种方法通过逐位与操作来计算1的个数。将数字与1进行按位与...

    《二进制基础知识》PPT课件.ppt

    计算机中的各种数制与进位计数制、各进制之间的相互转化、计算机中数据及编码、二进制数的计算机内部表示方法、二进制的算术、逻辑运算等都是二进制基础知识的重要组成部分。 计算机中的各种数制与进位计数制 ...

    十进制计数法.ppt

    例如,在二进制中,"十二"(12)表示为1100,因为12等于1*2^3 + 1*2^2 + 0*2^1 + 0*2^0。 自然数是指所有非负整数,包括0和正整数。最小的自然数是0,没有最大的自然数,因为自然数集是无限的。在数位顺序表中,十...

    PTA 统计一个整数的位数

    位数是指这个二进制表示中1的个数,对于非负整数,位数就等于其在十进制表示下的位数;对于负数,我们通常只关注其绝对值的位数。 解决“统计一个整数的位数”问题,可以采用以下几种方法: 1. **直接转换为字符串...

    计算机中数据的表示和计算.doc

    - **原码**:正数的原码就是其二进制表示,负数的原码在其绝对值的基础上最高位设为1。但原码表示中,0有两个形式,+0和-0。 - **补码**:补码解决了0的表示问题,正数的补码与原码相同,负数的补码是其原码逐位...

    1.2进制转换.pdf

    对于十进制数\( 53.6875 \),转换为二进制,首先对整数部分53使用除二取余法,得到\( (110101)_2 \),接着对小数部分0.6875使用乘二取整法,得到\( (0.1011)_2 \),所以最终的二进制表示为\( (110101.1011)_2 \)。...

    位1的个数1

    在计算机科学中,汉明重量(Hamming Weight)是指一个数字在二进制表示下“1”的个数。这个问题是编程挑战网站LeetCode上的一个问题,要求编写一个函数来计算无符号整数的汉明重量。这里我们将深入探讨如何解决这个...

    课件进制转换.pptx

    例如,十进制数923.45可以转换为二进制数1101.11*2^3+1*2^2+0*2^1+1*2^0+1*2^-1+5*2^-2,计算出相应的二进制表示。 6. **运算规则**:不同进制的数进行运算时,需要先转换为同一进制,然后按照该进制的运算法则进行...

    NumberOf1Between1andN.rar_The Number

    我们知道,对于任意正整数n,其二进制表示中的1的个数可以通过Kolmogorov's function(又称K-函数或popcount函数)来计算。这个函数返回一个整数的二进制表示中1的个数。在许多编程语言中,如C++,都有内置的位操作...

    1-7《数的产生与十进制计数法》课件.ppt

    《数的产生与十进制计数法》是数学教育中的重要内容,主要涉及人类计数方式的历史演变和现代计数体系的基本原理。本课件详细介绍了数的发展历程以及十进制计数法的规则和应用。 早期的人类采用各种简单的方式来记数...

Global site tag (gtag.js) - Google Analytics