例如:15 二进制为: 0000 1111
就返回4 个 1
我之前写过一篇用c语言,返回二进制参数1的个数:https://blog.youkuaiyun.com/question_mark/article/details/99637263
方法一:采用模2除2
11在内存中的存储是二进制:0000 0000 0000 0000 0000 0000 0000 1011
11%2=1
再将11/2(也可以看成二进制数右移一位)
11/2=5 其二进制:0000 0000 0000 0000 0000 0000 0000 0101
5%2=1
此时再将 5/2(再进行了一次右移动)
得到2 其二进制: 0000 0000 0000 0000 0000 0000 0000 0010
2%2=0
再将2/2(又进行了一次右移动)
得到1 其二进制:0000 0000 0000 0000 0000 0000 0000 0001
1%2=1
再将1/2 得到0 二进制:0000 0000 0000 0000 0000 0000 0000 0000
二进制中再无1,结束判断
可知11的二进制中1的个数有3个
具体实现代码如下:
public class CountOneBits {
public static int countOneBits(int num){
int count=0;
while(num>0){
if(num%2==1){
count++;
}
num/=2;
}
return count;
}
public static void main(String[] args) {
int i=2223;
System.out.println(Integer.toBinaryString(i));
System.out.println(countOneBits(i));
}
}
方法二:利用按位与进行判断
1的二进制数为 0000 0000 0000 0000 0000 0000 0000 0001
与1进行按位与,如果值为1,计数加1,值为0则不加,然后再将这个数右移一位
具体代码如下:
public class CountOneBits {
public static int countOneBits(int num){
int count=0;
while(num>0){
if((num & 1) ==1){
count++;
}
num=num>>1;
}
return count;
}
public static void main(String[] args) {
int i=666;
System.out.println(Integer.toBinaryString(i));
System.out.println(countOneBits(i));
}
}
方法三:n&(n-1)
以11 为例子
//11 :0000 0000 0000 0000 0000 0000 0000 1011
//10: 0000 0000 0000 0000 0000 0000 0000 1010
11&10:0000 0000 0000 0000 0000 0000 0000 1010 //10
//9: 0000 0000 0000 0000 0000 0000 0000 1001 //9
10&9: 0000 0000 0000 0000 0000 0000 0000 1000 //8
//7 :0000 0000 0000 0000 0000 0000 0000 0111
8&7: 0000 0000 0000 0000 0000 0000 0000 0000
进行三次的n&(n-1),即为11二进制中1的个数
代码如下
public class CountOneBits {
public static int countOneBits(int num){
int count=0;
while(num>0){
num=num&(num-1);
count++;
}
return count;
}
public static void main(String[] args) {
int i=5689;
System.out.println(Integer.toBinaryString(i));
System.out.println(countOneBits(i));
}
}
这篇博客介绍了三种Java方法来计算一个整数在二进制表示中1的个数。方法一通过模2除法和右移操作;方法二利用按位与运算;方法三使用n&(n-1)技巧。通过示例代码详细解释了每种方法的工作原理。
167万+

被折叠的 条评论
为什么被折叠?



