我想写一个c代码来设置第三位(0x4)并清除存储器地址0x3803的第七位(0x40),但我不确定我应该做的值(0x4和0x3F) &安培;”和“|”完成操作:
*((char *) 0x3803) = *((char *) 0x3803) | 0x4;
*((char *) 0x3803) = *((char *) 0x3803) & 0x3F;
我只是想确定我的价值观,无论是正确还是可能有其他替代价值
答案 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,因为编号从零开始。
另请注意,在实际软件中,应指定指针和位或位掩码,因为代码中间的魔术数字不受欢迎。