颠倒给定的 32 位无符号整数的二进制位。
循环32次,每次取出最后一位,放在新的数里,旧的树不断循环右移,新的数不断循环左移
public class Solution {
// you need treat n as an unsigned value
public int reverseBits(int n) {
int num = 0;
int temp = 0;
for (int i = 0; i < 32; i++) {
num = n&1;
temp = (temp<<1)+num;
n = n>>1;
}
return temp;
}
}
直接使用库函数
public class Solution {
// you need treat n as an unsigned value
public int reverseBits(int n) {
return Integer.reverse(n);
}
}
库函数的源码如下,有点无法理解
n = (n & 0x55555555) << 1 | (n >>> 1) & 0x55555555;
n = (n & 0x33333333) << 2 | (n >>> 2) & 0x33333333;
n = (n & 0x0f0f0f0f) << 4 | (n >>> 4) & 0x0f0f0f0f;
n = (n << 24) | ((n & 0xff00) << 8) |
((n >>> 8) & 0xff00) | (n >>> 24);
return n;
比较不错的注释来自 https://blog.csdn.net/gr79144845/article/details/100919052
//将32位二进制位以8位为一个单元编号1-8
//16进制5的二进制0101
//前半段取2、4、6、8位,直接左移一位,用2468替换1357位
//后半段直接右移一位,并取2468位。
//以8位为一个单元,现在编号依据原位置变成21436587
i = (i & 0x55555555) << 1 | (i >>> 1) & 0x55555555;
//16进制3的二进制表现形式是0011
//该计算后43218765
i = (i & 0x33333333) << 2 | (i >>> 2) & 0x33333333;
//16进制f的二进制表现形式为1111
//计算得出87654321
i = (i & 0x0f0f0f0f) << 4 | (i >>> 4) & 0x0f0f0f0f;