题目描述
输入一个整数,输出该数二进制表示中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 ;
}