二进制中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”