剑指offer-js 二进制中1的个数

二进制中1的个数

题目描述:

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

问题分析:

将数字转换成二进制数字,如果是直接求的话,注意数组反转,反转之后,若不够32位进行补零

负数的补码:
	求出绝对值的原码,从最后一个数字开始往前数,到第一个1之后把前面的全部取反

代码展示:

function NumberOf1(n)
{
    //还可以使用二进制转换来减少代码量 num.toString(2)
    var nums = [];
    var num = 0;
    var tmp = 0;
    if(n == 0)
        return 0;
    else if(n>=1){
        
        while(n>0){
            nums.push(n%2);
            n = parseInt(n/2);
        }
        nums.reverse();
        for(let i=0;i<nums.length;i++){
            if(nums[i] == 1)
                num++;
        }
        return num;
        
    }else{
        //求出绝对值的原码,从最后一个数字开始往前数,到第一个1之后把前面的全部取反
        n = Math.abs(n);
		let tmp = 0;
        while(n>0){
            nums.push(n%2);
            n = parseInt(n/2);
        }
        //数组反转
		nums.reverse();
        
		//共32位数字,若前面数字不够,则补零

		let count = 32-nums.length;
		if(nums.length <32){
			for(let i=0;i<count;i++){
				nums.unshift(0);
			}			
		}
        for(let i=nums.length-1;i>0;i--){
            if(nums[i] == 1){
                tmp = i;
            }
        }
        
        //取相反数字
        for(let i=0;i<tmp;i++){
            if(nums[i] == 0)
                nums[i] = 1;
            else if(nums[i] == 1)
                nums[i] = 0;
        }
            
        for(let i=0;i<nums.length;i++){
            if(nums[i] == 1)
                num++;
        }
        return num;
    }
}

总结:

n.toString(2)进制转换得到的数据是字符串,这个要注意一下
进制转换函数:
	parseInt(str,radix); 
		将字符串str按照radix进制编码方式转换为10进制返回,没有radix,默认为10; 
		此方法把任意进制字符串转为10进展返回。
		console.log(parseInt('23',8));  //19
		
	toString(radix);
		返回表示该数字的指定进制形式的字符串。
		(把10进制的数据转为指定进制,并以字符串形式输出);
		radix支持 [2, 36] 之间的整数。默认为10;
		var x = 66;x.toString(16); //“42”
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值