<分区>
我很好奇人们是如何想出按位问题的解决方案的。作为引用,我是本学期毕业的计算机工程专业学生。我参加了谨慎的数学、数字逻辑设计、数字电子学和其他涉及使用 bool 代数/按位运算的类(class)。但是,我仍然不太确定人们是如何想出按位问题的解决方案的。这是一个示例问题:
Reverse bits of a given 32 bits unsigned integer.
Input: 00000010100101000001111010011100
Output: 00111001011110000010100101000000
这是一个 C++ 的解决方案:
class Solution {
# define NUM_BITS 32
public:
uint32_t reverseBits(uint32_t n) {
uint32_t result = 0;
for (int i = 0; i < NUM_BITS; i++) {
if (n & (1 << i)) {
result |= (1 << ((NUM_BITS - 1) - i));
}
}
return result;
}
};
这实际上是一道 Leetcode 题。在这个问题中,我知道为什么 for 循环从 0 迭代到 31 是个好主意,我们正在处理一个 32 位整数,但条件语句和操作让我感到困惑:
if (n & (1 << i)) {
result |= (1 << ((NUM_BITS - 1) - i));
}
我明白这是怎么回事,但我不知道这是怎么推导出来的。使用某种真值表?怎么会有人在面试中想到这个?如果有人拿到纸和笔并花了几个小时才找到答案,我能理解,但总的来说,我很好奇人们是如何想出这些解决方案的。