`
ztianyi312
  • 浏览: 18258 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

计算二进制位有多少位1

阅读更多
  最近着迷于位运算,有这样一个问题如何算出一个数的二进制有多位1呢?
比较好的有下面两种方法
第一种:
unsigned int countBit(unsigned int n)
{
	unsigned int count = 0;
	while(n)
	{
		count++;
		n&=n-1;
	}

	return count;
}

原理比较简单每次执行 n&=n-1 时n的二进制都会少一个1.
第二种方法稍微有点复杂
unsigned int countBit2(unsigned int nValue)
{
	nValue = ((0xaaaaaaaa & nValue)>>1) + (0x55555555 & nValue);
	nValue = ((0xcccccccc & nValue)>>2) + (0x33333333 & nValue);
	nValue = ((0xf0f0f0f0 & nValue)>>4) + (0x0f0f0f0f & nValue);
	nValue = ((0xff00ff00 & nValue)>>8) + (0x00ff00ff & nValue);
	nValue = ((0xffff0000 & nValue)>>16) + (0x0000ffff & nValue);

	return nValue;
}

咋一看的确有点超出了一般人的想象力,
看一看输入0xFFFF后每一步的结果你就会明白点

1111111111111111(输入值)
1010101010101010(每两位数一组表示上一个数相应位有几个1)
0100010001000100(每四位数一组表示上一个数相应位两个数之和)
0000100000001000(每八位数一组表示上一个数相应位两个数之和)
0000000000010000(每十六位数一组表示上一个数相应位两个数之和)
0000000000010000(每三十二数一组表示上一个数相应位两个数之和)
很有技巧性,位数多的时候性能更好,不过它的缺陷就是只适合在32位的机器上,
前面一种算法在64位机器上也有效

1
2
分享到:
评论

相关推荐

    二进制位操作演示小工具

    6. **右移(>>)**:将二进制数的所有位向右移动指定的位数,左侧空出的位根据是否是符号位(对于有符号整数)填充1或0。 位操作在编程中有多种应用,例如: 1. **设置和清除位**:通过与操作可以方便地设置或清除特...

    易语言查表式取二进制位

    易语言查表式取二进制位是一种编程技术,主要用于处理二进制数据。在计算机科学中,二进制位是信息的基本单位,每一...此外,源码分析有助于深入理解二进制位操作的原理,这对于提升编程技能和解决实际问题都大有裨益。

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

    2. **位操作的应用**:利用位操作来实现高效计算二进制位中的1或0的个数。 3. **算法逻辑**:具体介绍两种算法逻辑,一种是计算1的个数,另一种是计算0的个数。 4. **C++ 实现**:提供完整的C++代码实现,包括函数...

    Multisim八位二进制转三位十进制

    1. **二进制到十进制的转换**:对每一位二进制数,乘以对应的权重(2^7, 2^6, ..., 2^0),然后将所有结果相加。在Multisim中,可以使用D型触发器和加法器来实现这个过程。 2. **位权处理**:由于我们要得到三位十...

    计算机二进制转换基础知识

    教程名称:计算机二进制转换基础知识课程目录:【】0.课程简介【】1.计算机系统进制概述【】2.十六进制与其它进制的转换【】3.二进制与其它进制的转换【】4.十进制与其它进制的转换【】计算机进制转换二进制、八进制...

    计算机与二进制教案.docx

    在二进制中,每个数字称为一个位(bit),每一位只能表示 0 或 1。与十进制不同,二进制数的权值从右向左递增,而不是从左向右。例如,在十进制中,数字 13 表示为 110^1 + 310^0,而在二进制中,数字 1101 表示为 12^...

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

    2. **位操作法**:利用位操作(如按位与、按位异或等)可以更高效地计算二进制中1的个数。一种常用的位操作技巧是“Brian Kernighan算法”。首先,将数与它减1的结果进行异或操作,这会将所有连续的1变成0,而把0...

    计算机基础二进制教案

    每一位(bit)在二进制中都有其特定的含义,0代表"关"或"无",1代表"开"或"有"。这种简单的逻辑使得计算机能够处理复杂的计算任务。二进制教案通常会涵盖以下几个关键知识点: 1. **二进制数系统的基本概念**:介绍...

    颠倒二进制位1

    颠倒二进制位 颠倒二进制位是指颠倒给定的 32 位无符号整数的二进制位。给定的整数可以用二进制表示形式表示,例如 00000010100101000001111010011100。为了颠倒这个二进制位,我们可以使用位操作来实现。 在这个...

    计算机数制二进制十进制十六进制总结PPT课件.pptx

    二进制数制是计算机中最基本的数制,使用 0 和 1 两个数字来表示数值。二进制数制可以表示整数和小数,整数部分使用除 2 取余的方法转换,小数部分使用乘 2 取整的方法转换。 三、十进制数制 十进制数制是人类最...

    易语言查表式取二进制位源码

    每一位(bit)在二进制数中都代表一定的值,0 或 1。二进制位操作包括取位、置位、清除位、反转位等,这些操作在底层编程中非常常见,例如在处理硬件接口、优化算法或进行数据编码时。 查表式取二进制位通常用于...

    二进制转换为十进制(Verilog代码)

    二进制系统(Base-2)使用两个符号,0 和 1,来表示数值,而十进制系统(Base-10)使用十个符号,0 到 9。在计算机科学中,尤其是硬件描述语言(如 Verilog)中,理解和实现这种转换至关重要。本段落将详细解释如何...

    计算机各种进制转换练习题(附答案).pdf

    1. 十进制数1000对应二进制数为1111101000,十六进制数为3E8。 在计算机中, 十进制是一种常用的数制,它使用0-9十个数字来表示数值。二进制是计算机中最基本的数制,它使用0和1两个数字来表示数值。十六进制是一种...

    16进制转换成二进制

    1. **单个十六进制数字转换**:每个16进制数字对应4位二进制数。例如: - `0` 在二进制中为 `0000` - `1` 在二进制中为 `0001` - `2` 在二进制中为 `0010` - ... - `9` 在二进制中为 `1001` - `A` 或 `a` 在二...

    汇编语言进制(二进制,八进制,十进制,十六进制)转换

    对于二进制转十六进制,每四位二进制数组成一位十六进制。 2. **其他进制转二进制**:可以逐位转换,将每个数字转换成相应的二进制表示。例如,八进制的5转为二进制是0101,十六进制的C转为二进制是1100。 3. **八...

    浮点数与二进制转换工具

    浮点数与二进制转换在计算机科学中是至关重要的概念,特别是在通信开发、数据存储和计算领域。本文将深入探讨浮点数和二进制之间的转换,以及如何利用工具进行这种转换。 浮点数是一种表示实数的方式,它允许在有限...

    计算机二进制转换PPT学习教案.pptx

    * 八进制数对应二进制的三位。 * 十六进制数对应二进制的四位。 * 例如:2C1D(H)=0010 1100 0001 1101(B) 四、二进制转换为八进制和十六进制 * 整数部分:从右向左进行分组,转化成八进制三位一组,十六进制四位一...

    二进制计算器(收藏)

    在“BinCalc.exe”这个文件中,我们可以推测这是一款二进制计算器的可执行程序,它很可能提供了一个直观的界面,让用户能够方便地输入各种数制的数值并进行转换计算。用户可以通过这个工具进行实践操作,加深对不同...

    基于VC++6.0 十进制转二进制,并计算校验和,生成二进制数据文件

    这对于初学者来说是一个很好的实践项目,有助于理解内存管理、数据类型、二进制转换和文件操作等基础知识。 首先,我们要了解十进制到二进制的转换。在计算机中,数据通常以二进制(0和1)的形式存储。对于一个十...

    浮点数二进制互转小工具

    这些常数在数学和科学计算中极其常见,因此能够快速获取它们的精确二进制表示对优化计算有重要意义。 压缩包内的"Double2Byte.exe"可能就是这个浮点数二进制转换工具的可执行文件,用户可以直接运行来进行浮点数和...

Global site tag (gtag.js) - Google Analytics