目标
颠倒给定的 32 位有符号整数的二进制位。
示例 1:
输入:n = 43261596
输出:964176192
解释:
整数 二进制
43261596 00000010100101000001111010011100
964176192 00111001011110000010100101000000
示例 2:
输入:n = 2147483644
输出:1073741822
解释:
整数 二进制
2147483644 01111111111111111111111111111100
1073741822 00111111111111111111111111111110
说明:
- 0 <= n <= 2^31 - 2
- n 为偶数
进阶: 如果多次调用这个函数,你将如何优化你的算法?
思路
颠倒 32 位有符号整数的二进制表示,返回其表示的数字。
题目限定 n 是正偶数,颠倒之后的最高位为 0,仍是非负数。模拟颠倒的过程,提前记录前导零的个数 lz,最后将结果左移 lz。
代码
/**
* @date 2024-06-08 22:28
*/
public class ReverseBits190 {
public int reverseBits_new(int n) {
int res = 0;
int lz = Integer.numberOfLeadingZeros(n);
while (n > 0) {
int b = n & 1;
res = (res << 1) | b;
n >>= 1;
}
return res << lz;
}
}
性能
