JS 二进制计算,如何得到一个负数的二进制表示

题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示
收获:
1.由负数的补码求他的绝对值补码:负二进制数的绝对值,只要各位(包括符号位)取反,再加1,就得到其绝对值。
2.负数正码取反(不包括符号位)+1即得到补码表示
3.JS中求二进制,(number).toString(2),负数和正数表示除了符号外相同。如(-123).toString(2) == ‘-1111011’, (123).toString(2) == ‘1111011’
原创:4.想得到负数n的二进制表示即补码, 对(Array(32).join(“0”)+(-n-1).toString(2)).slice(-32)按位取反;想得到正数n的二进制表示,(Array(32).join(“0”)+n.toString(2)).slice(-32)即可,不用按位取反。

参考资料:
详解正反补码:http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/computercode.html
JS二进制运算http://www.cnblogs.com/ecalf/archive/2012/11/26/2789870.html

function NumberOf1(n)
{
    // write code here
    //-123的二进制表示为-1111011,123的为1111011,因此首先要得到负数二进制的补码表示
    //其后面部分的补码0000101 = 122的正码1111011按位取反,
    //这个正码加上前面的0即是再全部按位取反即得-123的补码表示
    if(n < 0){
        n = -n;
        n = n-1;
        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 sum = 0;
    for(var i = 0; i < str.length; i++){
        if(str[i] == 1){
            sum ++;
        }
    }
    return sum;
}
//如果是负数,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;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值