题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
思路一:套函数,利用语言相关函数包来做。对于Java可用toBinaryString(n)方法,得到n的二进制,如果n是负数,得到n的二进制补码,关于ja转化的函数,我不深究了,网上有总结。对于Js,可以用toString(2)函数,但是对于负数没法使用,可以先将转化为无符号数再用该函数,至于为什么,,,我也没有相通。
代码一:
java:
public class Solution {
public int NumberOf1(int n) {
return Integer.toBinaryString(n).replaceAll("0","").length();
// write code here
}
}
js:
function NumberOf1(n)
{
//可能是错的解法
if(n<0){
n=n>>>0;
}
var count = 0;
var arr = n.toString(2).split('1');
return arr.length-1;
}
思路二:将一个数n与1进行"与“与”运算,可以判断该数的最右边是否为0,然后将该数右移,依次判断有多少个1,但是改方法有个缺点,负数右移补符号位1,所以可能会zao造成死循环,既无数个1.因为该方法有缺点,但如果用js来实现,还是可以的,因为Js可以将负数变成无符号数来移,这样右移就是补0,至于其他语言,我还没有找到解决改方法缺点的方法。不过该方法可以改进,变成另外一种思路,就可以解决这个缺点,具体见思路四。
代码二js:
function NumberOf1(n)
{
var count = 0;
while (n != 0) {
if ((n & 1) == 1) {
count++;
}
//无符合右移
n = n >>>1;
}
return count;
// write code here
}
思路三:为了解决思路二所存在的问题,我们可以将1左移,来与原来的数进行与操作,这样可以得出1的个数。代码如下(只贴Java,js一样差不多):
代码三java:
public class Solution {
public int NumberOf1(int n) {
int flag=1;
int count=0;
while(flag!=0){
if((n&flag)!=0)
count++;
flag<<=1;
}
return count;
// write code here
}
}
思路四:如果n二进制数最右边是1,那么n-1最右边为0。如果n最右边不是1,那么n-1就会与n最右的1开始不一样,所以n&(n-1)操作相当于将n二进制数减去一个1。说起来比较难理解,举例就懂了,比如:n为0110,n-1为0101,那么n&(n-1)得到0100,与之前n对比相当于n最右边1去掉了.因此统计次数就可以了。
代码四(贴Java,其它差不多):
public class Solution {
public int NumberOf1(int n) {
int count=0;
while(n!=0){
n=n&(n-1);
count++;
}
return count;
// write code here
}
}