【发布时间】:2013-08-15 05:59:02
【问题描述】:
我有一个整数n,我想在它的二进制表示中翻转它的kth 位(从最低位)。我该怎么做?
比如我有n=0b01101和k=2,那么结果就是0b01001=9
任何语言都可以。谢谢。
【问题讨论】:
我有一个整数n,我想在它的二进制表示中翻转它的kth 位(从最低位)。我该怎么做?
比如我有n=0b01101和k=2,那么结果就是0b01001=9
任何语言都可以。谢谢。
【问题讨论】:
要翻转一位或多位,请使用binary XOR。在您的情况下,适当的 XOR 掩码是左侧的 1 shifted k 位。
在 Python 中:
In [58]: 0b01101 ^ (1 << 2)
Out[58]: 9
表达式:
n ^ (1 << k)
在 C、Java、Python 和其他一些语言中有效(前提是适当定义了变量)。
【讨论】:
将数字 1 左移所需的位数,然后对数字进行异或运算。
JavaScript:
var num = 6, k = 2;
num = num ^ (1 << k);
发生了什么:
num = 0b01101 XOR (0b00001 << 2)
num = 0b01101 XOR 0b00100
num = 0b01001
【讨论】:
在 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 >> k) & 1 来查找位置k 处的值,而不是pow(2,k)。导致 RSHIFT 而不是函数调用,对于 power operator** 也可以这样说,尽管在性能方面这无关紧要。
这是你在 C 中的做法:
n ^ (1 << k)
【讨论】:
(对于谷歌用户)这里是你如何在 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"
【讨论】: