要求:计算非负数
二进制形式中1的个数.
本文采用两种方法来实现:
1) 通过
Integer#toBinaryString方法获得二进制
表达式, 替换掉0,那么剩余的都是1, 然后直接计算剩余字符串的长度来得到1的个数.
2) 采用位运算. 把一个整数减1,然后再与原来整数做与运算(&),会把该整数最右边一个1变成0,那么一个整数的二进制表示中有多少个1就可以进行多少次这样的操作.
具体的代码如下:
class="java">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