检查位是否已在 C 中切换
Check if bit has toggled in C
我正在研究按位操作(在 C 中),我想知道如何检查某个位是否已在先前值和新值之间切换。
Example :
oldValue = 0x0FF //0000 1111 1111 in binary
newValue = 0x100 //0001 0000 0000 in binary
在此示例中,我想检查 bit8(第 9 位)是否已从 0 切换到 1。
我知道如果我想知道是否设置了某个位,可以使用:
value & (1 << 8)
所以,这是正确的吗? :
if( (oldValue & (1 << 8)) == (newValue & (1 << 8)) ) //return 0 if toggled
您可以分两步完成:
首先,使用XOR
查找所有个已切换的位:
int allToggled = oldValue ^ newValue;
然后屏蔽你想保留的位——例如,通过向右移动allToggled
,使目标位在位置零,并用1
屏蔽:
int targetBitToggled = (allToggled >> 8) & 1;
现在将这两个表达式组合成一个条件:
if ((oldValue ^ newValue) & (1 << 8)) {
// ... bit at position 8 has toggled
}
请注意,我没有将 XOR
编辑的值向右移动,而是将位掩码向左移动。
使用 XOR,oldValue
和 newValue
之间的每个不同的位将为 1:
if((oldValue ^ newValue) == (1 << 7))
// 8th bit has toggled
我正在研究按位操作(在 C 中),我想知道如何检查某个位是否已在先前值和新值之间切换。
Example :
oldValue = 0x0FF //0000 1111 1111 in binary
newValue = 0x100 //0001 0000 0000 in binary
在此示例中,我想检查 bit8(第 9 位)是否已从 0 切换到 1。
我知道如果我想知道是否设置了某个位,可以使用:
value & (1 << 8)
所以,这是正确的吗? :
if( (oldValue & (1 << 8)) == (newValue & (1 << 8)) ) //return 0 if toggled
您可以分两步完成:
首先,使用XOR
查找所有个已切换的位:
int allToggled = oldValue ^ newValue;
然后屏蔽你想保留的位——例如,通过向右移动allToggled
,使目标位在位置零,并用1
屏蔽:
int targetBitToggled = (allToggled >> 8) & 1;
现在将这两个表达式组合成一个条件:
if ((oldValue ^ newValue) & (1 << 8)) {
// ... bit at position 8 has toggled
}
请注意,我没有将 XOR
编辑的值向右移动,而是将位掩码向左移动。
使用 XOR,oldValue
和 newValue
之间的每个不同的位将为 1:
if((oldValue ^ newValue) == (1 << 7))
// 8th bit has toggled