我得到一个正整数,并询问输出其补数。
即。
Input: 5
Output: 2
说明:5的二进制表示为101
(无前导零位),其补码为010
。所以我需要输出2
。
以下解决方案有效但我觉得它不是最有效的算法。任何人都可以发现任何可以改善的方式吗?最有可能使用按位运算符。
/**
* @param {number} num
* @return {number}
*/
var findComplement = function(num) {
var bin = Number(num).toString(2);
bin = bin.split('');
var answer = [];
for(var i = 0; i < bin.length; i++) {
console.log(bin[i])
if(bin[i] === '0') {
answer.push(1);
} else {
answer.push(0)
}
}
return parseInt( answer.join(''), 2 );
};
答案 0 :(得分:0)
这可能不会更快,但它只是一个班轮:
const complement = (n) => n.toString(2).split('').map((e) => e === '0' ? 1 : 0).join('', 2)
答案 1 :(得分:0)
检查功能complement
首先我们使用补码运算符~
,但它返回32位结果,因此~5
等于4294967290
(29 1
和010
总共32位)。接下来我们需要剥离那些前导1
,因此我们创建一个与二进制格式相同长度的掩码,即5
(101
)掩码为{{1即111
。使用7
运算符作为补码和我们的数字,我们得到了正确的结果。
希望很明显:)
您还可以运行代码段进行测试
&
function complement(n) {
var mask = Math.pow(2, n.toString(2).length) - 1;
return ~n & mask;
}
答案 2 :(得分:0)
如果我说得对,那么代码应该接近这个:
var findComplement = function(num) {
/* Skip leading zeros */
var power;
for (power = 31; power >= 0 && ((num & (1 << power)) === 0); power--);
/* Iterate through the rest of the number */
var result = 0;
for (var i = 0; i < power; i++) {
if ((num & (1 << i)) === 0)
result |= (1 << i);
}
return result;
}
然而,有一点我不确定:据我所知Number
类型是64位浮点数类型。由于浮点数和整数的表示不同(check this),因此如果查看所有64位,答案可能不是您所期望的。我可能错了,如果是这样的话,请纠正我。
答案 3 :(得分:0)
使用JavaScript的另一种方式。
const findComplement = (num) => {
return parseInt(
num
.toString(2)
.split('')
.map((i) => +!+i)
.join(''),
2
);
};
答案 4 :(得分:0)
数字补码的位技巧。
var findComplement = (num) => {
const mask = parseInt((+num).toString(2).replace(/\d/g, '1'), 2);
return num ^ mask;
};
console.log(findComplement(5));