【问题标题】:How do people come up with solutions to bitwise problems? [closed]人们如何想出解决按位问题的方法? [关闭]
【发布时间】:2019-09-15 20:36:43
【问题描述】:

我很好奇人们如何想出解决按位问题的方法。作为参考,我是本学期毕业的计算机工程专业的。我参加了谨慎的数学、数字逻辑设计、数字电子学和其他涉及使用布尔代数/按位运算的课程。但是,我仍然不太确定人们是如何提出按位问题的解决方案的。这是一个示例问题:

反转给定 32 位无符号整数的位。

输入:00000010100101000001111010011100

输出: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 问题。在这个问题中,我知道为什么从 0 到 31 迭代的 for 循环是一个好主意,我们正在处理一个 32 位整数,但是条件语句和操作让我感到困惑:

     if (n & (1 << i)) {
       result |= (1 << ((NUM_BITS - 1) - i));
     }

我了解这里发生了什么,但我不知道这是如何得出的。使用某种真值表?怎么会有人在面试中提出这个问题?如果有人拿了纸和铅笔,花了几个小时才发现这一点,我可以理解,但总的来说,我很好奇人们是如何想出这些解决方案的。

【问题讨论】:

  • 一些辛苦的工作。
  • 至少对我来说,在任何问题(不仅仅是针对按位运算)中,首先要以实用的方式思考解决方案——您将如何检查自己,然后尝试实施它使用我拥有的工具,例如此实例的按位运算。底线是它需要一些思考,而且人们的想法各不相同,所以对你来说更容易的事情对其他人来说更难,反之亦然。但练习总会让你变得更好。
  • 它遍历位,每当找到 1 时,在镜像位置设置 1。就像写了一个伪代码一样。
  • 我通常先“以人的身份”解决问题,然后再将其转化为代码。因此,如果有人对您说要反转输入的位并将它们写下来,那么您可能会逐位读取这些位并手动将输出向后写。这将成为您代码中的 for 循环。然后你需要弄清楚如何测试输入的每一位,这就是可怕的位移代码的来源。
  • 坚持真的。我记得我自己发现了如何测试一个数字是否是 2 的幂。我花了整整一页的时间来写位并手动进行位运算才能最终弄清楚。在我完成之前我固执地拒绝查找它,当我查找它时,它就在那里:已经是一个 answer 在 SO 上。你只需要寻找模式。我仍然有兴趣找出从其他基础看素数是否有模式。那将是令人兴奋的

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


【解决方案1】:

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

您可以从考虑算法开始,就好像您实际上有一个布尔数组一样,然后使用简单的按位 sn-ps 将索引更改为数组,用于 test-kth-bit、set-kth-bit 等。

尽管如此,这种方法并不会带来高级解决方案。

【讨论】:

    【解决方案2】:

    与任何其他数学/技术/技能相关问题的方式相同:解决类似问题的经验(大部分)。

    问问自己,在攻读学位的早期,您是如何学会求解非平凡积分的。你会发现你需要做很多事情来获得关于如何解决问题的直觉(而不是盲目地尝试)。

    顺便说一句,如果你设法完全回答了这个问题,你可能已经解决了人工智能;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-29
      • 2021-06-12
      • 2021-11-05
      • 1970-01-01
      相关资源
      最近更新 更多