题目链接
思路:
翻转二进制位,可以理解为将二进制的每一位(假设为第 i 位)向左移 31 - i 位,并且每一次需要将原始二进制向右移动一位,保证每一次需要向左移动的二进制位在第0位,直到原始二进制为0,即可实现翻转。
例如: 此处以 4 位二进制位举例。
原始 1 1 0 0 翻转后为 0 0 1 1
取出第 0 位,向左移动 4 - 0 位, 即 0 * * *,( * 表示剩余元素),原始二进制向右移动一位,即 0 1 1 0
取出第 1 位,向左移动 4 - 1 位, 即 0 0 * *,( * 表示剩余元素),原始二进制向右移动一位,即 0 0 1 1
取出第 2 位,向左移动 4 - 2 位, 即 0 0 1 *,( * 表示剩余元素),原始二进制向右移动一位,即 0 0 0 1
取出第 3 位,向左移动 4 - 3 位, 即 0 0 1 1,( * 表示剩余元素),原始二进制向右移动一位,即 0 0 0 0
public int reverseBits(int n) {
int result = 0;
for (int i = 0; i <= 31; i++) {
result <<= 1; // 结果每次向左移动一位,空出低位
result += n & 1; // 取出二进制的低位,与之前结果相加
n >>= 1; // 低位已经使用完毕,向右移动一位
}
return result;
}