中文:leetcode-cn.com/problems/re…
题目描述
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为[−,
− 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
题解
/**
* @param {number} x
* @return {number}
*/
var reverse = function (x) {
// 把数字转成字符串,再把字符串转成数组
// 123 -> "123" -> ["1", "2", "3"]
// -123 -> "-123" -> ["-", "1", "2", "3"]
let arr = x.toString().split('');
// 判断是否有负号
if (arr[0] !== "-") {
// ["1", "2", "3"] -> ["3", "2", "1"] -> "321" -> 321
// 如果原数字是 120,在这一步用 Number() 会直接把0去掉
let num = Number(arr.reverse().join(''));
if (num <= Math.pow(2, 31) && num >= -Math.pow(2, 31)) {
return num;
} else {
return 0;
}
} else if (arr[0] === "-") {
delete arr[0];
let num = Number(arr.reverse().join(''));
if (num <= Math.pow(2, 31) && num >= -Math.pow(2, 31)) {
// 取反之后,加1
return ~num + 1;
} else {
return 0;
}
}
};
按位取反?
数字1按位取反:~1
1的二进制为: 00000001
按位取反之后:11111110
按位取反完成,再把这个二进制转成十进制
转十进制的时候,发现符号位(即最高位)为1,表示这是个负数
将除符号位之外的其他取反:10000001
末位加1取其补码:10000010
最后转成十进制:-2
负数二进制转十进制?
除去符号位减1;
除去符号位,按位取反;结果就是负数的原码;
原码转成相应的十进制
有符号二进制转十进制?
初始值 11110000
1:按位取反 00001111
2:将上一步得到的结果加 1 生成补码 00010000
3:转换为十进制 16