统计一个二进制数中“1”的个数
首先将一个10进制的数变成2进制的数输出,方便查看
使用字符串的拼接来实现(只考虑在int范围内的数),代码如下:
Scanner sc=new Scanner(System.in);
int num=sc.nextInt();
int n=num;//复制一个备用
String str="";
while(num!=0)
{
str = num%2+str;
num = num/2;
}
System.out.println(str);
然后使用与运算(&):
n&=n-1;
这个语句的功能是将最低位的“1”消除
比如:
n=10010
n-1=10001
(注:为了方便理解,我将变化的数用不同颜色标记)
n&=n-1结果就是10000,这样就成功消去了最低位的“1”,然后再来一遍与运算,最高位的“1”也回被消去,这样,我们只需要统计做了几次与运算就可以知道有多少个“1”了。
代码如下:
int flag = 0;
while(n != 0)
{
n&=n-1;
flag++;
}
System.out.print(flag);
总代码如下:
import java.util.Scanner;
public class Binary {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int num=sc.nextInt();
int n=num;
String str="";
while(num!=0)
{
str = num%2+str;
num = num/2;
}
System.out.println(str);//将十进制数用二进制输出
int flag = 0;
while(n != 0)
{
n&=n-1;
flag++;
}//做与运算然后统计运算次数即为“1”的个数
System.out.print(flag);
}
}
运算结果:
同时,我们也可以用这个方法,来判断一个数是不是2的整数次方。
一个数为2的整数次方说明,在某一位上值为1,其他都为0,所以我们用n&n-1消去这个1,结果就等于0,这样我们就可以用一个语句来判断了。
if(n&(n-1)==0);
System.out.print("是2的整数次方");