【问题标题】:Flip the k-th significant bit翻转第 k 个有效位
【发布时间】:2019-10-23 08:46:46
【问题描述】:

我想找到一种更好的方法来实现以下目标:

n = 6
k = 1

Flip the 1st significant bit in 6

Variable      Binary representation      Decimal Representation
       n                        110                           6
m(result)                       010                           2

我想实现与this wiki 文章中相同的目标

这是我做的,但我觉得有点矫枉过正,效率低下:

def toggleKthSignificantBit(self, n, k):
        tmp = list(bin(n)[2:].zfill(3))
        tmp[k-1] = str(int(tmp[k-1]) ^ 1)
        tmp2 = ''.join(tmp)
        print(tmp2)
        return int(tmp2, 2)

【问题讨论】:

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


    【解决方案1】:

    IIUC 或许

    n ^ 2**(len(bin(n)) - (2 + k))
    

    def toggle_kth_left_to_right(n, k):
        res = n ^ 2**(len(bin(n)) - (2+k))
        return bin(n)[2:], bin(res)[2:]
    
    # toggle_kth_left_to_right(6, 1)
    # ('110', '10')
    
    # toggle_kth_left_to_right(6, 2)
    # ('110', '100')
    
    # toggle_kth_left_to_right(6, 3)
    # ('110', '111')
    

    【讨论】:

      【解决方案2】:

      假设k是位的位置

      那么这应该可以解决问题

      x=n^(2**k)
      bin(x)
      

      附录:如果我们从左边数位,那么我们可以执行以下操作

      x = n^(2**(int(n).bit_length()-k))
      bin(x)
      

      【讨论】:

      • 如果 k 从右到左计数为零(这是我们在数学上习惯的),那就是正确的答案。但是,我的印象是 OP 是从左到右计算一个。
      • 是的,在这种情况下,索引是从左到右的,因为最高有效位(MSB,也称为高位)是二进制数中具有最大值的位位置。
      • 我认为,第一行是我的问题的解决方案,但我找到了一个等价的。
      【解决方案3】:

      经过一番检查,我找到了解决问题的方法:

      但是,我想我找到了一个等效的解决方案:

      n ^ (2**(butterfly_rank - k))
      

      【讨论】:

      • 那么您应该编辑您的问题,因为正如 cmets 中所述并经您确认,接受的答案不是您所要求的。
      • 我运行了这个解决方案和 llia 的解决方案,我得到了相同的结果
      • 是的,但您要求相反;在 Ilia 的回答和您自己的确认下查看我的评论。
      • 那么,我该怎么办呢?据我了解,如果我们从 0 从右到左开始,lila 的答案就有效,而我的答案是从 1 从左到右开始。但是我还是看到了同样的结果,那我应该接受什么呢?
      • 否 - IMO 你的答案和 Ilia 的答案完全一样:从右到左计数零。与此相反:你的问题和我的答案从左到右算一个。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-15
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      • 2017-06-26
      • 2019-08-13
      • 1970-01-01
      相关资源
      最近更新 更多