我的刷题日记(6)

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

首先得清楚怎么求一个整数的二进制?
什么是原码,反码,补码?
比如用四位的二进制数表示1 ,则为0001
正数的原码:第一位是0(符号位)表示正数0001
负数的原码:第一位是1表示负数。1001

正数的 : 原码 = 反码 = 补码

负数的反码: 符号位不变其余取反。1变为0,0变为1。 1001 => 1110
负数的补码: 负数的反码加1。(比如说上面-1的反码1110加1(先将1变成四位二进制数0001)为11111)

两个相反数二进制的原码相加不为0,所以两个相反二进制数相加要用它们的反码相加才为0

现在来看看这道题目:
分步分析
1,首先要知道用js求一个整数的二进制。
2,如果该正数是负数还要用js求出它的补码。
3,然后要找出该数中1的个数。
这个题目也没说是多少位数的二进制,我试了一下-1的输出正确答案是32位,所以应该是用32位计算。
当为正数的时候不用管是多少位,但是当为负数的时候需要补满32位。

function methodA(x) {
	// 计算一个数的二进制
    const arr = [];
    let num = x;
    if(num === 0) {
        return 0;
    } else if(num < 0) {
        num = - num;
    }
    while(num > 0) {
        arr.unshift(num%2);
        num = Math.floor(num/2);
    }
    if(x < 0) {
    	// 如果该整数为负数
        const arr1 = [];
        const num1 = 32 - arr.length;
        for(let i=0;i<num1;i++){
            arr1[i]=0;
        }
        arr.unshift(...arr1);
        for (let i = 0;i< arr.length;i++) {
            if(arr[i] === 0){
                arr[i] = 1;
            } else {
                arr[i]=0;
            }
        }
        return findone(plus1(arr))+1;
    } else {
        return findone(arr);
    }
}


// 二进制加1
function plus1(arr) {
    let len = arr.length-1;
    let point  = arr[len];
    while (len >= 0 ) {
        if(point === 0) {
            arr[len] = 1;
            return arr;
        } else if(point === 1) {
            arr[len] = 0;
            point = arr[len-1];
            if(len === 0) {
                arr.unshift(1);
            }
            len--;
        }
    }
    return arr;
}

// 在数组中找出1的个数
function findone(arr){
    let num =0;
    for (const item of arr) {
        if(item === 1){
            num++;
        }
    }
    return num ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值