c++ - 人们如何想出按位问题的解决方案?

标签 c++ bit-manipulation bitwise-operators bit

<分区>

我很好奇人们是如何想出按位问题的解决方案的。作为引用,我是本学期毕业的计算机工程专业学生。我参加了谨慎的数学、数字逻辑设计、数字电子学和其他涉及使用 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));
     }

我明白这是怎么回事,但我不知道这是怎么推导出来的。使用某种真值表?怎么会有人在面试中想到这个?如果有人拿到纸和笔并花了几个小时才找到答案,我能理解,但总的来说,我很好奇人们是如何想出这些解决方案的。

最佳答案

可以通过将整数视为简单的 bool 数组来找到这些简单的方法。

您可以从考虑算法开始,就好像您确实拥有一个 bool 数组,然后使用简单的按位代码段更改对数组的索引,例如 test-kth-bit、set-kth-bit 等。

虽然这种方法不会导致高级解决方案。

关于c++ - 人们如何想出按位问题的解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57948016/

相关文章:

c++ - 如何将一个无符号的 short 一分为二

c++ - RAND_MAX 和 UINT_MAX 之间的差异会有所不同吗?

php - 优先级和位掩码操作

c - 分数与位运算相乘

c# - C# 中左移位的奇怪行为

c - 在两个字节上写入 uint8 变量?

c++ - 如果类包含标准容器,我可以将类 move 操作标记为 noexcept 吗?

c++ - freemodbus eMBRegCoilsCB 函数体示例

php - 在 Windows 上使用 SWIG 编译 PHP 扩展

c++ - 为什么基类函数没有被同名的派生类函数隐藏