c - 位操作,不必要的掩码?

标签 c bit-manipulation bit-shift

我正在尝试掌握嵌入式 C 编程中的位操作。

我有以下代码

#define X_POS       (8UL)
#define X_MASK      (0x1FUL<<X_POS)
#define Y_POS       (16UL)
#define Y_MASK      (0x3UL<<Y_POS)

typedef struct {         
    uint32_t  res[6];  
    uint32_t  config[10];                            
} myStruct_type;

myStruct_type myStruct;

void configure (uint32_t n, uint32_t x, uint32_t y)
{
    myStruct.config[n] &= ~(X_MASK | Y_MASK);     // A
    myStruct.config[n] |= ((x<<X_POS) & X_MASK) | ((y<<Y_POS) & Y_MASK);  // B
}

int main (void)
{
    configure(3, 18, 2);

    while (1) { }
}

据我所知,标有注释 A 的行用于将感兴趣的位设置为 0,即清除这些位。

我还了解到,在标有 B 的行上,感兴趣的位被设置为想要的值。

但是 B 行的 X_MASK 和 Y_MASK 的目的是什么???不是由

设置的值
(x<<X_POS) | (y<<Y_POS)

最佳答案

B 行屏蔽的目的是确保只设置您想要设置的位。例如如果 x 是 0xFFFFFFFF&X_MASK 将停止设置您感兴趣的位之上的位。

因此假设 config[0] 从 0 开始,x 是 0xFFFFFFFF 并且 y 是 0,如果没有 maskingin 行 B,您将拥有

myStruct.config[0] &= ~(X_MASK | Y_MASK);     // config[0] is still 0
myStruct.config[0] |= (0xFFFFFFFF << 8) | (0<< 16);  
// config[0] is now 0xFFFFFF00 

有了面具,第二行是

 myStruct.config[0] |= ((0xFFFFFFFF<< 8) & 0x1F00) | (( 0 << 16) & 3 << 16);  // B

这是

myStruct.config[0] |= 0x1F00 | 0);

关于c - 位操作,不必要的掩码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42791160/

相关文章:

c++ - bool vector 的数学 ADD 运算

javascript - 如何获取 32 位整数的位长度

c - 快速舍入数字 >= 0 到 2 的特定幂的倍数

c++ - 在 C++ 中,哪个更快? (2 * i + 1) 或 (i << 1 | 1)?

c - 有符号整数的算术位移

c++ - 如何避免等待信号已发送的 pthread_cond_t

c - TCP-IP套接字C : Bad address error when trying to connect to server socket

c - C 语言中有 crypt 函数吗?或者我必须自己构建该功能?

c - 如何在C中将IP4和IP6地址转换为长值?

c - c 中的位移位字符