设置并清除存储器地址位

时间:2013-08-31 09:06:40

标签: c++ c embedded bit-manipulation

我想写一个c代码来设置第三位(0x4)并清除存储器地址0x3803的第七位(0x40),但我不确定我应该做的值(0x4和0x3F) &安培;”和“|”完成操作:

*((char *) 0x3803) = *((char *) 0x3803) | 0x4;
*((char *) 0x3803) = *((char *) 0x3803) & 0x3F; 

我只是想确定我的价值观,无论是正确还是可能有其他替代价值

3 个答案:

答案 0 :(得分:1)

要清除一点,您需要AND一个补码值,即0x40的倒置,即0xBF。您可以让编译器使用~为您计算值。

请注意,您可以使用&=|=

*((char *) 0x3803) |= 0x04;
*((char *) 0x3803) &= ~0x40;

答案 1 :(得分:1)

我写这个的方式如下:

*((char *) 0x3803) = *((char *) 0x3803) | 0x4;  // Unchanged from what you already had
*((char *) 0x3803) = *((char *) 0x3803) & ~0x40;

要清除特定位,我喜欢按位使用按位否定,以避免出现的问题。你知道你想要清除被0x40屏蔽的位,所以按位否定将翻转所有位并产生0xbf ...正确的值清除位0x40 ...

答案 2 :(得分:1)

我会让编译器弄清楚位掩码并只给它位数:

*((char *) 0x3803) |= (1 << 2);
*((char *) 0x3803) &= ~(1 << 6);

注意,第三和第七位实际上是位2和6,因为编号从零开始。

另请注意,在实际软件中,应指定指针和位或位掩码,因为代码中间的魔术数字不受欢迎。