【问题标题】:how to flip a bit at a specific position in an integer in any language如何在任何语言的整数中的特定位置翻转位
【发布时间】:2013-08-15 05:59:02
【问题描述】:

我有一个整数n,我想在它的二进制表示中翻转它的kth 位(从最低位)。我该怎么做?

比如我有n=0b01101k=2,那么结果就是0b01001=9

任何语言都可以。谢谢。

【问题讨论】:

    标签: java python c


    【解决方案1】:

    要翻转一位或多位,请使用binary XOR。在您的情况下,适当的 XOR 掩码是左侧的 1 shifted k 位。

    在 Python 中:

    In [58]: 0b01101 ^ (1 << 2)
    Out[58]: 9
    

    表达式:

    n ^ (1 << k)
    

    在 C、Java、Python 和其他一些语言中有效(前提是适当定义了变量)。

    【讨论】:

      【解决方案2】:

      将数字 1 左移所需的位数,然后对数字进行异或运算。

      JavaScript:

      var num = 6, k = 2;
      num = num ^ (1 << k);
      

      发生了什么:

      num = 0b01101 XOR (0b00001 << 2)
      num = 0b01101 XOR 0b00100
      num = 0b01001
      

      【讨论】:

        【解决方案3】:

        在 c 中,您只需执行此操作即可切换它:

        n ^= 1 << k;
        

        但还有其他方法可以这样做:

        n |= ( 1 << k);
        

        这会将位 k 移到 1

        现在如果你想翻转位,你可以用一元做一个 if 语句,看看你需要如何翻转它

        number = pow(2,k)    
        if((number & n) != number)
            //this means that it's a 0 at position k
            n |= ( 1 << k);
        else
            //this means that it's a 1 at position k
            n &= ( 0 << k);
        

        【讨论】:

        • n 为整数时,您可以使用(n &gt;&gt; k) &amp; 1 来查找位置k 处的值,而不是pow(2,k)。导致 RSHIFT 而不是函数调用,对于 power operator** 也可以这样说,尽管在性能方面这无关紧要。
        【解决方案4】:

        这是你在 C 中的做法:

        n ^ (1 << k)
        

        【讨论】:

          【解决方案5】:

          (对于谷歌用户)这里是你如何在 VB6 中做到这一点而无需移动

          'flips a bit to the opposite of its current value
          '1 based, left to right
          Function FlipBit(ByVal FlipByte As Byte, ByVal bPosition As Byte) As Byte
              FlipBit = FlipByte Xor (2 ^ (8 - bPosition))
          End Function
          
          'example
           MyByte = 255
          'mybyte is now "11111111"
           MyByte = FlipBit(MyByte,2)
          'mybyte is now "10111111"
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-12-20
            • 2023-03-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多