【问题标题】:How do you think masking bit problems?您如何看待掩盖位问题?
【发布时间】:2022-07-19 03:52:44
【问题描述】:

例如,在 4 年前提出的一个反转位函数问题的答案中:

[reverse_Bits 函数] https://stackoverflow.com/a/50596723/19574301

代码:

def reverse_Bits(n, no_of_bits):
      result = 0
      for i in range(no_of_bits):
         result <<= 1
         result |= n & 1
         n >>= 1
      return result 

我完全不明白如何思考这个问题。

您将实际数字 (n) 乘以 1 以检查右侧的第一个位。然后你右移这个数字加一,所以当你检查第二位是否为 0再次,这适用于所有位。所以基本上你是添加如果实际 (?) 位中有 1,则结果为 1。在你身边左移结果,所以我了解您正在尝试将位放入正确的索引中,如果有的话,您添加它...我在这里迷路了。

我的意思是,我知道代码可以工作并且我知道如何工作,但是如果没有这个参考,我无法从零开始做,因为我不知道你是如何实现对算法的每一步的思考。

我不知道我是否解释了我的问题,或者它只是一团糟,但希望有人能帮助我!

    标签: bit-manipulation bitwise-operators bit bit-shift bitmask


    【解决方案1】:

    如果您的问题是,“我如何在没有任何帮助的情况下从头开始编写这个?”然后我个人发现它来自于草拟简单案例、手动处理它们和渐进式实施的组合。

    例如,您可能从示例开始:您有数字 3(因为它很容易)并且您想要反转位:

    3 = 0000 0011 b 
    
    need to &1 and if it is non-zero, write 1000 0000 b
    need to &2 and if it is non-zero, write 0100 0000 b
    need to &4 and as it is zero, write nothing... 
    ...
    

    好的,我怎样才能自动化 1,2,4,8,16,32 .. ?可以有一个加倍的变量,或者我可以将一个数字左移 1。选择你的,没关系。

    对于写值,同样的事情,我怎样才能写 1000 0000 b 然后 0100 0000 b 等等?好吧,从 1000 0000 b 开始,然后除以 2 或右移 1。

    有了这两个简单的东西,你最终会得到这样的东西:

    result = 0
    src_mask = 0x01
    dst_mask = 0x80 
    if number & src_mask != 0:
        result |= dst_mask
    

    有点工作。然后添加一个循环,以便您可以执行所有位,并为 src_mask 添加一个 *2 并为 dst_mask 添加一个 /2,因为您这样做是为了解决每个位。同样,这一切都是从纸上的涂鸦中得出的,这些涂鸦列出了我希望对每一位发生的事情。

    然后是优化,我不喜欢'if',所以我能想出一种无需测试直接添加位的方法吗?如果它是 0,它将添加 0,如果设置了该位,那么我添加该位?

    这通常是进展。手动涂鸦,先设计,然后逐步改进。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2018-12-31
      • 2010-09-05
      • 2010-10-04
      相关资源
      最近更新 更多