二进制中1的个数(十一)

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

function NumberOf1(n){
    
    //当输入的为一个负数时
    //-123的二进制表示为-1111011 123的二进制表示为1111011  123的后面部分的补码0000101=122的正码 1111011按位取反
    //所以一个负数的二进制为 它的正数的二进制的负数  这个正数后面的补码 就等于 (这个正数-1)的正码按位取反 
    if(n<0){
        n=-n;//将负数变为正数
        n=n-1;//再将这个正数-1 因为这个正数减一取反 即为这个正数的补码 然后将这个正数的补码全部按位取反即得-123的补码表示
              //因为一个负数的二进制是它的正数的二进制取反 
        //所以可以将这个负数变为正数 然后再-1  得到的二进制,就是正数的补码  然后将这个正数的补码全部按位取反即得-123的补码表示
        var str=(Array(32).join('0')+n.toString(2)).slice(-32);
        str=exchange(str);
    }else{
        var str=(Array(32).join('0')+n.toString(2)).slice(-32);
    }

    return cal(str);

}

/**
 * 计算1的个数
 */
function cal(str){
    var count=0;
    for(var i=0;i<str.length;i++){
        if(str[i]==1){
            count++;
        }
    }
    return count;
}

//如果是负数,0变1,1变0
function exchange(str){
    var arr=str.split('');
    for(var i=0;i<arr.length;i++){
        if(arr[i]==0){
            arr[i]=1;
        }else{
            arr[i]=0;
        }
    }
    str=arr.join('');
    return str;
}

 

posted @ 2018-09-06 23:05  mino1996  阅读(304)  评论(0编辑  收藏  举报