很神奇啊...同样一段代码之前怎么运行都是错的....换了个题回来的功夫就正确了....
题目
输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示。
数据范围:,即范围为:-2147483648≤n≤2147483647
解析
就是底下这段代码,测试10的时候一会为12不对了,一会又为2正确了...也不太可考了,看代码吧
int NumberOf1(int n ) {
int count = 0;
while (n>0) {
if ( n%2 == 1){
count++;
}
n=n/2;
}
return count;
}
其实就是十进制转二进制辗转相除法,但它没有办法处理负数,所以参考了网上大佬的方法如下:
技巧法
可以转换一下思路,让一个数从右向左与n的每一位进行&操作来判断,但是需要运行32次。
现考虑二进制数:val:1101000, val-1: 1100111 那么val & (val-1) : 1100000
可能存在的提问:哪里有转化为2进制运算?
回答:&是位运算,就是对数的二进制表示做运算。
代码
int NumberOf1(int n ) {
int ans=0;
while(n!=0){
ans++;
n = n&(n-1);
}
return ans;
}