题目:
题目链接: https://leetcode-cn.com/problems/reverse-bits/
解题思路:
需要首先说一点,这个题是颠倒,是左右颠倒
刚开始我以为是0修改为1,1修改为0了,直接使用异或操作了,后来才发现看错题了
使用临时变量按位一位位的读取的操作大家应该都会,介绍一个不需要循环感觉很惊艳的骚操作
因为是固定的32位,所以采用二分的思想
先将前16位和后16位进行交换
然后对于前16位中的前8位和后8位进行交换,后16位中的前8位和后8位进行交换
如此反复,知道对最后单个位进行交换
代码实现:
class Solution:
def reverseBits(self, n: int) -> int:
# 前16位和后16位交换
n = (n >> 16) | (n << 16)
# n & 0xff00ff00 = 前后16位中的前8位
# n & 0x00ff00ff = 前后16位中的后8位
n = ((n & 0xff00ff00) >> 8) | ((n & 0x00ff00ff) << 8)
# n & 0xf0f0f0f0 = 每8位中的前4位
# n & 0x0f0f0f0f = 每8位中的后4位
n = ((n & 0xf0f0f0f0) >> 4) | ((n & 0x0f0f0f0f) << 4)
# c = 0x1100
# 3 = 0x0011
# n & 0xcccccccc = 每4位中的前两位
# n & 0x33333333 = 每4位中的后两位
n = ((n & 0xcccccccc) >> 2) | ((n & 0x33333333) << 2)
# a = 0x1010
# 5 = 0x0101
# n & 0xaaaaaaaa = 每2位中的前1位
# n & 0x55555555 = 每2位中的后1位
n = ((n & 0xaaaaaaaa) >> 1) | ((n & 0x55555555) << 1)
return n