190. Reverse Bits
例: 0011
--> 11000000000000000000000000000000
,而不是简单的1100
如果不考虑位数的话就是一个二进制转成十进制的程序:
res = 0;
while (n > 0) {
res = res * 2 + n % 2;
n /= 2;
}
return res;
转换成位操作的话就是把里面的乘除模替换成一元运算符
输入n
是一个无符号整数,取值范围在0~4294967295
,用普通的int会溢出
java 8 中无符号整数和整数之间的转换:
String bs = "11111111111111111111111111111101";
int num = Integer.parseUnsignedInt(bs, 2);
System.out.println(Integer.toUnsignedString(num)); // 输出的是字符串
因为32位的二进制可能是整数溢出,然后还涉及到一个右移和除2的关系,它们会有区别是因为int溢出会变成负数
public int reverseBits(int n) {
int res = 0;
for (int i = 0; i < 32; i++) {
res <<= 1; // 相当于*2
if ((n & 1) == 1) res++;
n >>= 1;
// n /= 2; // 使用 test 11111111111111111111111111111101 的时候右移和除二结果是不一样的, 除2会比右移结果多1, 因为中间溢出变成负数
}
return res;
}
感觉蛮难的居然是easy