输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。
class Solution {
public int NumberOf1(int n) {
int count = 0;
//比较巧妙的方法,统计出现一个整数二进制数值(计算机中数值都是以补码的形式存在的,正数的补码为本身,负数的补码
// 需要额外求出来,先求反码,然后再加一。反码是符号位不变,然后其余位取反)
while(n!= 0){
count++;
//让n和n-1做按位与操作,假如有一个数二进制为1100,现在要统计这个二进制数中出现的1的个数,那么它减一之后为1011,此时做&运算可以把它
//最右边出现的1开始后面的所有位置零,下一次循环就继续找到下一个最右边的值,如此往复,那么就可以一个统计出
//整形二进制中1出现的个数。
n = n & (n - 1);
}
return count;
}
}
这里在补充一点关于求一个整数的二进制的一些方法
public static int NumberOf1(int n) {
/*
* 第一种方法,自己想的
* */
boolean flag = false;
if (n < 0) {
n=-n;
}
int index;
ArrayList arrayList = new ArrayList();
StringBuilder sb = new StringBuilder();
while (n / 2.0 != 0) {
index = n % 2;
n = n / 2;
arrayList.add(index);
}
System.out.println(arrayList);
Collections.reverse(arrayList);//获得了二进制的表现初级形式.
System.out.println(arrayList);
int len = 32 - arrayList.size();
for (int i = 0, k = 0; i < 32; i++) {//获得32位二进制表示的字符串
if (i < len) {
sb.append("0");
} else {
sb.append(arrayList.get(k));
k++;
}
}
String str = sb.toString();
System.out.println(str);
if(flag){//如果该整数,就还有进行求反码,以及根据反码求补码
sb.setCharAt(0,'1');
for(int i=1;i<=31;i++){//除了符号位取反
if(sb.charAt(i)=='0'){
sb.setCharAt(i,'1');
}
else{
sb.setCharAt(i,'0');
}
}
//加一操作
if(sb.charAt(sb.length()-1)=='0'){//如果最后一位为零,那么直接加一即可,这里是直接设置为1
sb.setCharAt(sb.length()-1,'1');
}
else {//如果最后一位不为0,那么就是1,加一之后,要让它变成零,进位
//找到倒数第一个为零的字符,然后让这个字符置为1,它后面的字符都为0
int zeroIndex = sb.lastIndexOf("0");
sb.setCharAt(zeroIndex,'1');
for(int ind=zeroIndex;ind<sb.length()-1;ind++){
sb.setCharAt(ind,'0');
}
}
str=sb.toString();
System.out.println(str);
}
/*
* 第二种方法
* */
for(int j=31;j>=0;j--){
if(((1<<j)&n)!=0){
System.out.print("1");
}else {
System.out.print("0");
}
}
/*
* 第三种方法
* */
System.out.println(Integer.toBinaryString(26));
return 1;
}
问题虽然是暂时得到了解决关于本题,引发了我的新的疑问,就是如果说要统计0出现的次数应该怎么写?(不用系统函数的情况)欢迎广大网友给点建议?