要求:计算非负数二进制形式中1的个数.
本文采用两种方法来实现:
1) 通过
Integer#toBinaryString方法获得二进制表达式, 替换掉0,那么剩余的都是1, 然后直接计算剩余字符串的长度来得到1的个数.
2) 采用位运算. 把一个整数减1,然后再与原来整数做与运算(&),会把该整数最右边一个1变成0,那么一个整数的二进制表示中有多少个1就可以进行多少次这样的操作.
具体的代码如下:
public class Example {
/**
* 通过Integer#toBinaryString方法获得二进制表达式, 替换掉0,剩余的都是1, 然后直接计算剩余字符串的长度来得到1的个数.
*
*/
public int method1(int num) {
if (num < 0) {
throw new IllegalArgumentException("请输入一个非负整数.");
}
return Integer.toBinaryString(num).replaceAll("0", "").length();
}
/**
* 该方法采用的思想是:
* 把一个整数减1,然后再与原来整数做与运算(&),会把该整数最右边一个1变成0,那么一个整数的二进制表示中有多少个1就可以进行多少次这样的操作.
*/
public int method2(int num) {
if (num < 0) {
throw new IllegalArgumentException("请输入一个非负整数.");
}
int count = num == 0 ? 0 : 1;
while ((num = (num & (num - 1))) > 0) {
count++;
}
return count;
}
public static void main(String[] args) {
Example m = new Example();
for (int i = 980; i < 1000; i++) {
System.out
.printf(
"整数%3d的二进制表示为%s,其中1的个数,\nMethod1()的结果是%d,\nMethod2()的结果是%d\n\n",
i, Integer.toBinaryString(i), m.method1(i), m
.method2(i));
}
}
}
简单的测试结果如下:
整数980的二进制表示为1111010100,其中1的个数,
Method1()的结果是6,
Method2()的结果是6
整数981的二进制表示为1111010101,其中1的个数,
Method1()的结果是7,
Method2()的结果是7
整数982的二进制表示为1111010110,其中1的个数,
Method1()的结果是7,
Method2()的结果是7
整数983的二进制表示为1111010111,其中1的个数,
Method1()的结果是8,
Method2()的结果是8
整数984的二进制表示为1111011000,其中1的个数,
Method1()的结果是6,
Method2()的结果是6
整数985的二进制表示为1111011001,其中1的个数,
Method1()的结果是7,
Method2()的结果是7
整数986的二进制表示为1111011010,其中1的个数,
Method1()的结果是7,
Method2()的结果是7
整数987的二进制表示为1111011011,其中1的个数,
Method1()的结果是8,
Method2()的结果是8
整数988的二进制表示为1111011100,其中1的个数,
Method1()的结果是7,
Method2()的结果是7
整数989的二进制表示为1111011101,其中1的个数,
Method1()的结果是8,
Method2()的结果是8
整数990的二进制表示为1111011110,其中1的个数,
Method1()的结果是8,
Method2()的结果是8
整数991的二进制表示为1111011111,其中1的个数,
Method1()的结果是9,
Method2()的结果是9
整数992的二进制表示为1111100000,其中1的个数,
Method1()的结果是5,
Method2()的结果是5
整数993的二进制表示为1111100001,其中1的个数,
Method1()的结果是6,
Method2()的结果是6
整数994的二进制表示为1111100010,其中1的个数,
Method1()的结果是6,
Method2()的结果是6
整数995的二进制表示为1111100011,其中1的个数,
Method1()的结果是7,
Method2()的结果是7
整数996的二进制表示为1111100100,其中1的个数,
Method1()的结果是6,
Method2()的结果是6
整数997的二进制表示为1111100101,其中1的个数,
Method1()的结果是7,
Method2()的结果是7
整数998的二进制表示为1111100110,其中1的个数,
Method1()的结果是7,
Method2()的结果是7
整数999的二进制表示为1111100111,其中1的个数,
Method1()的结果是8,
Method2()的结果是8
分享到:
相关推荐
3. **库函数法**:C语言标准库提供了一些函数,如`__builtin_popcount`(GCC扩展)或`__popcnt`(Windows平台),可以直接计算一个整数的二进制表示中1的个数。这些函数通常由编译器优化,速度非常快。 ```c #...
在PHP编程中,有时我们需要计算一个二进制数中1的个数,这在计算机科学中被称为“位计数”或“位集”。本篇将详细介绍两种PHP实现统计二进制中1的个数的算法,并提供相关代码示例。 **问题描述** 给定一个十进制...
例如,在二进制中,基数是2,权重分别是2的0次幂、2的1次幂、2的2次幂等。 进行数制转换时,最常见的方法是按权相加。例如,将二进制数1001转换为十进制,就是1×2^3 + 0×2^2 + 0×2^1 + 1×2^0 = 8 + 0 + 0 + 1 =...
数值型数据直接用二进制表示,非数值型数据需要转换成特定的二进制编码,如ASCII码或Unicode编码,才能在计算机中处理。 5. **校验码** 校验码用于检测数据传输或存储过程中的错误,如奇偶校验、海明码和循环冗余...
5.6 编写程序,将一个包含有20个数据的数组M分成两个数组:正数数组P和负数数组N,并分别把这两个数组中的数据的个数显示出来。 5.7 试编制一个汇编语言程序,求出首地址为DATA的100D字数组中的最小偶数,并把它放在...
- 算式11×4096+7×512+6×64+5×8+3的二进制形式中1的个数反映了乘法运算过程中各位上1的个数。计算这些乘法结果中1的个数可以得到最终答案。 通过以上习题,学生能够深化对微机原理中数值表示、内存地址计算、...
题目要求计算一个整数中二进制表示下1的个数。这是一个基础的位操作问题,常见的解决方案有几种,包括使用循环、位操作和位计数技巧。下面我们将详细介绍这些方法: 1. **循环计数法**:最直观的方法是将数字除以2...
15. bit是数据的最小单位,即二进制数的1位,选项A正确。 16. 一个字节由8个二进制位组成,选项B正确。 17. 十六进制数单位在书写时常使用字母H表示。 18. 计算机内部存储汉字使用的是汉字的内码。 填空题部分:...
在给定的描述中,提到了一个应用示例,即计算一个整数二进制表示中1的个数。这可以通过遍历整数的二进制位并检查每一位是否为1来实现。对于正数,我们可以直接使用位右移和按位与操作来完成。例如,给定整数n,我们...
9. 计算机内部信息表示:计算机内所有信息以二进制数码形式表示,基本单位是比特(bit)。 10. 存储容量单位:衡量计算机存储容量的常见单位是字节(Byte)。 11. 定点数与浮点数:浮点数可以表示整数和小数部分,定点...
2. **校验位计算**:奇校验位用于确保数据位中1的个数为奇数,偶校验位则确保为偶数。例如,1010110添加奇校验位后应为10101101,1010011添加偶校验位后为10100110。 3. **ASCII码**:美国标准信息交换码(ASCII)...
9. **计算机内部数据表示**:计算机内部所有信息均以二进制数码形式表示。 10. **存储容量单位**:衡量存储容量的常用单位是字节(Byte)。 11. **定点数与浮点数**:浮点数可以表示整数和小数,定点数既可以表示...
计算机系统基于二进制(Base-2)进行运算,因为它是最简单且易于电子设备处理的形式。二进制由0和1组成,而其他进制如十进制(Base-10)、八进制(Base-8)和十六进制(Base-16)则用于简化二进制数的表示。例如,八...
- 按位运算:包括与(AND)、或(OR)、非(NOT)、异或(XOR)等,常用于二进制数据的处理。 - 二进制加减法:涉及到进位和借位,如A7H+B8H进行无符号加法。 - 补码运算:用于表示负数,补码表示的加减运算可以...
1. 二一十进制码:这是一种在字节中存储十进制数字的方法,一个字节通常可以存储8位二进制数,所以最多可以表示10进制的256个数字。题目中提到,一个字节能存放的十进制数字个数是2个。 2. 奇偶校验码:这种校验...
最后,将所有部分加在一起,得到十进制数,并将其存储在二进制形式中。 在代码转换的实验中,使用了位操作(AND、SHR)来分离BCD码的各个部分,并使用ADD和ADC指令进行加法运算,同时借助了SHL(左移位)指令来逐步...
BCD码(Binary-Coded Decimal,二进制编码的十进制数)是用来表示十进制数的二进制编码方式,分为压缩和非压缩两种形式,题目中涉及到了这两种形式的转换。 7. **十六进制与二进制的转换**: 16进制与二进制之间...
9. 当补码表示的数[X]补的第一位(符号位)为1,其余位至少有一个为1时,X > -1/2成立,因为补码表示中,负数的绝对值越大,其补码的二进制位中1的个数越多。 10. CPU主要包括控制器、运算器和高速缓存(cache)...