1

我正在尝试确定可用于解析字节的特定位的逻辑,我想检查它是否已设置,如果已设置,则仅转到特定的代码行。我应该能够对二进制值执行 AND 或 OR 操作,但是如果位的位置是第三位或其他位置然后 MSB 和 LSB,我将无法在代码中使用真或假条件,而是我将不得不使用 AND 或 OR 操作来比较值。

例如,如果 AND 操作是 00100000,那么我必须将它与 00100000 进行比较并执行条件语句。

4

2 回答 2

6

如果要测试字节的第 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自始至终都使用了这个名称,但只要您的移位在正确的范围内,您就可以使用任何整数类型的任何位来执行此操作。

于 2013-01-07T15:51:46.853 回答
1

它是这样工作的:

首先要注意的是值0在C测试中为假,任何其他值都被认为是真。

然后,要测试是否设置了某个位,请使用以下测试(我几年前制作的一组宏之一)

#define IS_SET(number, position) (number & (1 << position))

那么你可以像这样使用它:

if(IS_SET(15,2)){ }. 但是请注意,位计数从最右边的位开始向左移动,从最右边的位开始计数0

以下是宏的实际工作方式(注意,这适用于所有整数类型,8 位、16 位、32 位等)按位表示的数字150x0F = 0000 0000 0000 0000 0000 00000 1111 111132 位机器上。

左移12 次,成功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)
------------------------------------------

这样,您可以测试要设置或清除的位序列中的任何位置。

于 2013-01-07T15:56:30.643 回答