整数数组中的位操作
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
.
通过这个例子你可以理解更复杂的例子。
#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
.
通过这个例子你可以理解更复杂的例子。