1

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

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

我只是想确保我的价值观是正确的,或者这些价值观可能有其他替代品

4

3 回答 3

1

我会让编译器找出位掩码,只给它位号:

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

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

另请注意,在实际软件中,应命名指针和位或位掩码,因为代码中间的这种幻数是不受欢迎的。

于 2013-08-31T13:02:30.710 回答
1

要清除一点,您需要AND使用补码,即 的反转,0x400xBF。您可以让编译器使用~.

请注意,您可以使用&=and|=为此:

*((char *) 0x3803) |= 0x04;
*((char *) 0x3803) &= ~0x40;
于 2013-08-31T09:21:46.297 回答
1

我写这个的方式如下:

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

要清除特定位,我喜欢使用按位否定和按位,以避免您演示的问题。您知道您要清除被 0x40 屏蔽的位,因此按位求反将翻转所有位并导致 0xbf... 清除位 0x40 的正确值...

于 2013-08-31T09:22:44.350 回答