我正在尝试确定可用于解析字节的特定位的逻辑,我想检查它是否已设置,如果已设置,则仅转到特定的代码行。我应该能够对二进制值执行 AND 或 OR 操作,但是如果位的位置是第三位或其他位置然后 MSB 和 LSB,我将无法在代码中使用真或假条件,而是我将不得不使用 AND 或 OR 操作来比较值。
例如,如果 AND 操作是 00100000,那么我必须将它与 00100000 进行比较并执行条件语句。
我正在尝试确定可用于解析字节的特定位的逻辑,我想检查它是否已设置,如果已设置,则仅转到特定的代码行。我应该能够对二进制值执行 AND 或 OR 操作,但是如果位的位置是第三位或其他位置然后 MSB 和 LSB,我将无法在代码中使用真或假条件,而是我将不得不使用 AND 或 OR 操作来比较值。
例如,如果 AND 操作是 00100000,那么我必须将它与 00100000 进行比较并执行条件语句。
如果要测试字节的第 N位(对于正常的 8 位字节,N = 0..7),可以使用:
if (byte & (1 << N))
...Nth bit is set...
测试条件只是检查表达式是 0(假)还是非零(真)。您可以通过以下方式明确说明:
if ((byte & (1 << N)) != 0)
...Nth bit is set...
您可以使用以下命令设置第 N位:
byte |= 1 << N;
您可以使用以下命令重置(归零)第 N位:
byte &= ~(1 << N);
您可以使用以下方法翻转或切换第 N位:
byte ^= (1 << N);
尽管我byte
自始至终都使用了这个名称,但只要您的移位在正确的范围内,您就可以使用任何整数类型的任何位来执行此操作。
它是这样工作的:
首先要注意的是值0在C测试中为假,任何其他值都被认为是真。
然后,要测试是否设置了某个位,请使用以下测试(我几年前制作的一组宏之一)
#define IS_SET(number, position) (number & (1 << position))
那么你可以像这样使用它:
if(IS_SET(15,2)){ }
. 但是请注意,位计数从最右边的位开始向左移动,从最右边的位开始计数0
。
以下是宏的实际工作方式(注意,这适用于所有整数类型,8 位、16 位、32 位等)按位表示的数字15
在0x0F = 0000 0000 0000 0000 0000 00000 1111 1111
32 位机器上。
左移1
2 次,成功0000 0000 0000 0000 0000 0000 0000 0100
对这两个数字进行 AND 运算得到:
0000 0000 0000 0000 0000 0000 1111 1111
0000 0000 0000 0000 0000 0000 0000 0100 &
------------------------------------------
0000 0000 0000 0000 0000 0000 0000 0100 (which is not 0, hence true)
------------------------------------------
这样,您可以测试要设置或清除的位序列中的任何位置。