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