整数数组中的位操作

Bit Manipulation in Integer Array

  #define SET_BIT(byte, bit) (byte |= (1 << bit))
  #define CLEAR_BIT(byte,bit) (byte &= ~(1 << bit))
    uint8_t data [5];
    for (int i = 0; i < 5; ++i)
    {
        for(int j = 7; j >= 0; --j)
        {
            if (some condition)          
        -->    CLEAR_BIT(data[i],j);
            else if (some condition)  
        -->    SET_BIT(data[i],j); 
        }
}   

我想了解箭头线中的位操作是如何发生的?

当我声明 uint8_t 数据 [5]; 是否意味着...一个名称数据数组,我可以存储 5 个 uint8_t 值(基本上是字符)在其中和每个数组索引的位置将有 8 位。Like This

因为您使用 define,所以在 pre-processing 期间,行 SET_BIT(data[i],j) 被替换为 data[i] |= (1 << j)(考虑改用 inline 并受益于类型安全)。

最好的理解方式是举一个简单案例的例子(避免这些嵌套循环)。

(假设您的数据数组已初始化为 0,但目前并非如此)

例如:i = 2, j = 3:

1 << 3 = 00001000 将值 1 向左移动三次,data[2] = 00000000

|= 是一个 bit-wise 运算符,因此 - 每个对应位之间的逻辑 OR 将发生并且 data[2] 将等于 00001000

现在,i = 2, j = 6

1 << 6 = 01000000, data[2] = 00001000

A bit-wise OR 将发生并产生 1 位 3,6。

data[2] 将等于 01001000.

通过这个例子你可以理解更复杂的例子。