检查位是否已在C中切换

Bik*_*mat 2 c bit-manipulation toggle

我正在进行按位操作(在C中),我想知道如何检查一个位是否在前一个值和新值之间切换.

Example :
    oldValue = 0x0FF //0000 1111 1111 in binary
    newValue = 0x100 //0001 0000 0000 in binary
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我想检查bit8(第9位)是否已从0切换到1.

我知道如果我想知道是否设置了一下,可以使用:

value & (1 << 8)
Run Code Online (Sandbox Code Playgroud)

那么,这是正确的吗?:

if( (oldValue & (1 << 8)) == (newValue & (1 << 8)) ) //return 0 if toggled
Run Code Online (Sandbox Code Playgroud)

das*_*ght 6

您可以分两步完成:

首先,用于XOR查找已切换的所有位:

int allToggled = oldValue ^ newValue;
Run Code Online (Sandbox Code Playgroud)

然后屏蔽要保留的位 - 例如,allToggled向右移动,使目标位在零位,并使用以下掩码1:

int targetBitToggled = (allToggled >> 8) & 1;
Run Code Online (Sandbox Code Playgroud)

现在将这两个表达式组合成一个条件:

if ((oldValue ^ newValue) & (1 << 8)) {
    // ... bit at position 8 has toggled
}
Run Code Online (Sandbox Code Playgroud)

请注意,XOR我没有向右移动-ed值,而是将位掩码向左移动.