我想写一个c代码来设置第三位(0x4)并清除内存地址0x3803的第七位(0x40),但我不确定我应该制作“&”的值(0x4和0x3F)和“|” 完成操作:
*((char *) 0x3803) = *((char *) 0x3803) | 0x4;
*((char *) 0x3803) = *((char *) 0x3803) & 0x3F;
我只是想确保我的价值观是正确的,或者这些价值观可能有其他替代品
我想写一个c代码来设置第三位(0x4)并清除内存地址0x3803的第七位(0x40),但我不确定我应该制作“&”的值(0x4和0x3F)和“|” 完成操作:
*((char *) 0x3803) = *((char *) 0x3803) | 0x4;
*((char *) 0x3803) = *((char *) 0x3803) & 0x3F;
我只是想确保我的价值观是正确的,或者这些价值观可能有其他替代品
我会让编译器找出位掩码,只给它位号:
*((char *) 0x3803) |= (1 << 2);
*((char *) 0x3803) &= ~(1 << 6);
请注意,第三和第七位实际上是位 2 和 6,因为编号从零开始。
另请注意,在实际软件中,应命名指针和位或位掩码,因为代码中间的这种幻数是不受欢迎的。
要清除一点,您需要AND
使用补码,即 的反转,0x40
即0xBF
。您可以让编译器使用~
.
请注意,您可以使用&=
and|=
为此:
*((char *) 0x3803) |= 0x04;
*((char *) 0x3803) &= ~0x40;
我写这个的方式如下:
*((char *) 0x3803) = *((char *) 0x3803) | 0x4; // Unchanged from what you already had
*((char *) 0x3803) = *((char *) 0x3803) & ~0x40;
要清除特定位,我喜欢使用按位否定和按位,以避免您演示的问题。您知道您要清除被 0x40 屏蔽的位,因此按位求反将翻转所有位并导致 0xbf... 清除位 0x40 的正确值...