`
功夫小当家
  • 浏览: 186802 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

求一个数的二进制中1的个数 (n种解法详述)

阅读更多

今天研究了一个有趣的算法,而且还牵连了很多其他知识,这个问题倒是很简单。

问题:求一个数的二进制中1的个数

 

方法1:

 

public class YiWei {

	/*
	 * 函数名:count1() 原理:n和1求&,当n的末位是1时,&结果是1;然后把n右移1位,再判断。 
	 * 缺陷:只适用于正数,当n是负数时错误。
	 * 原因:移位操作的时候,没考虑符号位,会使负数变成正数
	 */
	public int count1(int n) {
		int count = 0; // 计数器
		while (n != 0) {
			if ((n & 1) != 0) {
				count++;
			}
			n = n >> 1;

		}
		return count;
	}
}

 

 

方法2:

 

public class YiWei {
	/*
	 * 函数名:count2() 
	 * 原理:设置一个变量flag = 1,让flag与n求& ,若结果不是0,
	 *       则计数器加1;flag左移1位,再比较
	 * 适用范围:正数,0,负数均可
	 */
	public int count2(int n) { // 这个方法,正数和负数都适用,

		int count = 0;
		int flag = 1;
		int i = 1;
		while (i <= 32) {   //移动32次
			if ((flag & n) != 0) {

				count++;
			}
			flag = flag << 1;
			i++;
		}
		if ((flag & n) > 0) {

			count++;
		}

		//System.out.println(Integer.toBinaryString(n) );
		//System.out.println(Integer.toBinaryString(n).length() ); 
		return count;
	}
}

   

 

方法3:

 

public class YiWei {	
	/*
	 * 函数名:count3() 
	 * 原理:若n最右边的1在第k个位置,那么n-1之后,第k个位置的数由1变0,k之后的由0变1,k之前的不变。
	 *       再把n-1和n求& ,会把该整数最右边的1变为0。因此有多少个1,就循环几次。
	 */
	public int count3(int n) {
		//System.out.println(Integer.toBinaryString(n) );
		//System.out.println(Integer.toBinaryString(n).length() ); 
		int count = 0;
		while (n != 0) {
			count++;
			n = n & (n - 1);
		}
		
		return count;
	}
}

 

 

 

方法4:

 

public class YiWei {
	/*
	 * count4() 使用java提供的方法 
	 * 原理:java提供了Integer到Binary的转换,求出的二进制字符串,存在StringBuilder里,
	 *       然后循环查找是否有0,如果有,则删除,最后的结果为全是1的字符串,求下length即可
	 */
	public int count4(int n) {
		int count;
		StringBuilder s = new StringBuilder(); // 注意用StringBuilder类型,可变字符串。
		s.append(Integer.toBinaryString(n));
		System.out.println(s);
		while (s.indexOf("0") != -1) {// 判断是否有0 存在,若有则删除字符串中所有的0
			s.deleteCharAt(s.indexOf("0"));
		}
		count = s.length();// 此时的字符串s里面存的全是1,求一下length即可知道1的个数
		return count;
	}
}

 

 

 

 这道题牵连到的问题:

  1.正数 : 原码 = 反码= 补码

  2.负数 : 反码 = (除符号位)按位取反,补码 = 反码 + 1

  3.0的补码是0,并且唯一

  4.+0的原码 = 0000 0000B

     - 0的原码 = 1000 0000B

  5. 与运算: n & (n-1) 的特点;n & flag 的结果;1&1=1,其他为0

  6. 移位操作:左移(*2) ,右移(/2)

  7.Integer类提供的toBinary方法

  8.StringBuilder类提供的字符串处理方法

分享到:
评论

相关推荐

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

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

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

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

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

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

    求二进制数中1的个数

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

    十进制转二进制中1的个数.txt

    2. **转换为二进制**:对于每一个读入的十进制数,将其转换为二进制表示。 3. **统计1的个数及其位置**:在二进制表示中,记录下所有1出现的位置,并按顺序输出这些位置。 #### 2.2 C语言实现 下面是基于以上思路的...

    判断32位无符号整数二进制中1的个数

    该方法的思路是预先建立一个表,存放了从0到2^32每个数中1的个数,然后通过查表来获得结果。代码如下: ```c char tOne[256] = "\0\1\1\2\1\2……"; int findone(unsigned int n){ int i = 0; while (n &gt; 0) { i ...

    二进制中1的个数1

    当我们谈论一个整数在二进制中的1的个数时,实际上是在寻找它的二进制表示中1的出现次数。这个问题在实际编程中经常遇到,尤其是在算法和数据结构的题目中,比如LeetCode上的这个题目。 给定的描述要求我们实现一个...

    进制数转换二进制八进制十进制十六进制之间转换方法PPT学习教案.pptx

    每种进制数都有其特定的表示法和规则,如二进制的规则是逢2进1,八进制的规则是逢8进1,十进制的规则是逢10进1,十六进制的规则是逢16进1。 三、进制数之间的转换规则 (1)十进制转换为其他进制数:按位权乘以...

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

    在计算机科学领域,统计一个数二进制表示中1的个数是一个常见的操作,被称为“位计数”或“ Hamming重量”。这个任务在很多算法和数据结构问题中都有应用,比如哈夫曼编码、数字签名、计算数字的奇偶性等。本课程...

    十进制转二进制的方法

    十进制数转二进制数、八进制数、十六进制数的方法是相同的,即整数部分用除基取余的算法,小数部分用乘基取整的方法,然后将整数与小数部分拼接成一个数作为转换的最后结果。 例如,要将 16 转换成二进制数,可以...

    给定一个十进制正整数N,程序输出从1到N的所有整数中,“1”出现的个数。DMU

    在本题目中,我们需要编写一个C语言程序,用于计算从1到给定正整数N之间所有整数中数字"1"出现的总次数。这是一个典型的字符串处理和数学计算问题,涉及到了数字转换、字符串遍历以及计数算法。下面我们将深入探讨这...

    从键盘输入一个十进制数,二进制显示

    从键盘输入一个十进制数,二进制显示 从键盘输入一个十进制数,二进制显示

    列举N位二进制数

    在列举N位二进制数的问题中,我们可以从最简单的单位二进制数(0和1)开始,然后递归地增加每一位,每次增加一位,都有两种可能的值(0或1)。递归函数可以这样定义: ```python def enumerate_binary(n): if n ==...

    无符号数二进制转十进制

    2. **循环读取输入**:使用`MOVCX, 16`设置循环次数为16次,对应一个字节的二进制位数(实际上,此处可能意在处理更长的二进制数)。 3. **读取字符并判断**:通过`MOVAH, 1`和`INT 21H`读取标准输入中的字符,然后...

    汇编统计1的个数(二进制)

    汇编实现统计输入数据中1的个数,转换为二进制判断

    将任意一个十进制数转换成n(16以内)进制的相对应数

    本文将详细解释将任意一个十进制数转换成n(16以内)进制的相对应数的知识点。 标题解释 标题“将任意一个十进制数转换成n(16以内)进制的相对应数”表明了本程序的主要功能,即将十进制数转换成其他进制数(≤16...

    二进制数与十六进制数之间的相互转换

    1. `convert` 函数:这是主要的转换函数,它接受两个字符串参数,一个是输入的二进制数(`input`),另一个是输出的十六进制数(`output`)。 - `len1 = strlen(input)`:获取输入二进制数的位数。 - `pos = len1 ...

    提取数据(把一个二进制的各位分开)

    标题中的“提取数据(把一个二进制的各位分开)”指的是将一个二进制数的每一位提取出来,单独进行操作或分析。这通常涉及到位操作,包括位移、与、或、异或等,以及二进制到其他数字格式的转换,如BCD(二进制编码...

    统计整数的二进制表示形式中有几个1(java实现)

    统计整数的二进制表示形式中有几个1(java实现),代码中有三种方法,分别是利用除、余的方法,位运算,以及利用“与”运算的方法。其中第三种方法效率最高,二进制数中有几个1,算法中的循环内的运算就执行几次。

    数值转换(从键盘读入二个五位十进制数(1位符号位+4位数值位),并将这二个十进制数分别转换为二进制数,然后求其和,再将和以十进制形式进行显示。)

    在 sjzhxs 模块中,首先从键盘读入第一个五位十进制数,并将其转换为二进制数,然后保存在 BIN_BUF1 中。接着,从键盘读入第二个五位十进制数,并将其转换为二进制数,然后与第一个数相加,得到和。最后,将和转换为...

Global site tag (gtag.js) - Google Analytics