C 带算术运算符的数组?

C 带算术运算符的数组?,c,arrays,C,Arrays,我一直在审查一些现有的代码,挂断了电话。我在下面列出了所有与问题相关的代码。注意,变量evt是包含36个元素的枚举类型的一部分,但是为了简单起见,我只编写了36个元素中的3个 这条线是: events[evt / 32] |= (uint32_t)1 << (evt % 32); events是位映射,它将与evt的值对应的位设置为1。前32位进入事件[0],后4位进入事件[1]evt%32获取余数,这是位偏移量,1events是位映射,这是将与evt值对应的位设置为1。前32位进

我一直在审查一些现有的代码,挂断了电话。我在下面列出了所有与问题相关的代码。注意,变量
evt
是包含36个元素的枚举类型的一部分,但是为了简单起见,我只编写了36个元素中的3个

这条线是:

events[evt / 32] |= (uint32_t)1 << (evt % 32);

events
是位映射,它将与
evt
的值对应的位设置为
1
。前32位进入
事件[0]
,后4位进入
事件[1]
evt%32
获取余数,这是位偏移量,
1
events
是位映射,这是将与
evt
值对应的位设置为
1
。前32位进入
事件[0]
,后4位进入
事件[1]
evt%32
获取余数,即位偏移量,
1请尝试一些示例。当
evt==5
时,这将设置
事件[0]
的位
5
。当
evt==34
时,它将设置
事件[1]
的第2位
evt
本质上是一个数字,因此您可以对其进行算术运算。通过将其除以32,可以得到一个介于0和1之间的整数,这是
事件
的正确索引。我注意到
事件
是易变的,可能由多个线程同时访问。值得注意的是,
|=
操作是非原子的,如果多个线程试图同时设置事件,则可能会产生意外的结果。其中一个事件集有可能被覆盖或丢失。请尝试一些示例。当
evt==5
时,这将设置
事件[0]
的位
5
。当
evt==34
时,它将设置
事件[1]
的第2位
evt
本质上是一个数字,因此您可以对其进行算术运算。通过将其除以32,可以得到一个介于0和1之间的整数,这是
事件
的正确索引。我注意到
事件
是易变的,可能由多个线程同时访问。值得注意的是,
|=
操作是非原子的,如果多个线程试图同时设置事件,则可能会产生意外的结果。其中一个事件集有可能被覆盖和丢失。
static volatile uint32_t events[8];

typdef enum event_e
{
EVT_1,
EVT_2,
EVT_36
}event_t;

void event_set(event_t evt)
{
events[evt / 32] |= (uint32_t)1 << (evt % 32);
}