• 二进制中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;
    }
  • 相关阅读:
    分糖果
    数字游戏
    错误票据
    包子凑数
    带分数
    翻硬币
    核桃的数量
    快速幂
    公倍数与素数筛选
    mysql 查询当天当周当月的数据
  • 原文地址:https://www.cnblogs.com/cmy1996/p/9601832.html
Copyright © 2020-2023  润新知