题目描述
给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。
注意:
给定的整数保证在32位带符号整数的范围内。
你可以假定二进制数不包含前导零位。
示例 1:
输入: 5 输出: 2 解释: 5的二进制表示为101(没有前导零位),其补数为010。所以你需要输出2。
示例 2:
输入: 1 输出: 0 解释: 1的二进制表示为1(没有前导零位),其补数为0。所以你需要输出0。
解答思路
有三种思路
先将十进制转为二进制, 然后对每一项作处理(如果是0,则转为1, 如果是1, 则转为0), 然后将该二进制转为十进制.
对于思路一, 对每一项操作使用异或操作(异或: 参与运算的两个值,如果两个相应位相同,则结果为0,否则为1。即:0^0=0, 1^0=1, 0^1=1, 1^1=0)
利用二进制的定义
二进制运算
补充知识: javascript 进制转换(2进制、8进制、10进制、16进制之间的转换)
javascript中十进制转其他
const x = 5; console.log(x); console.log(x.toString(8)); console.log(x.toString(32)); console.log(x.toString(16));
javascript中其他转为十进制
const x = 5; console.log(parseInt(x, 2)); console.log(parseInt(x, 8)); console.log(parseInt(x, 16));
解答方案
方法一:
/** * @param {number} num * @return {number} */var findComplement = function(num) { const a = num.toString(2); let result = []; for(let i = 0;i < a.length; i++) { if(a[i] == 0) { result.push(1); } else { result.push(0); } } return parseInt(result.join(''),2); };
方法二:
/** * @param {number} num * @return {number} */var findComplement = function(num) { return parseInt(num.toString(2).split('').map((a) => 1 ^ a).join(''), 2) };
方法三:
/** * @param {number} num * @return {number} */var findComplement = function(num) { const a = num.toString(2); let result = 0; for(let i = 0;i < a.length; i++) { if(a[i] == 0) { result += Math.pow(2, a.length - i - 1) } } return result; };
作者:funnycoderstar
链接:https://www.jianshu.com/p/90c10067e1ec