2013-08-31 39 views
1

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

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

我只是想确保我的价值,要么其权利或可能有其他替代这些值

+0

0x4是正确的,0x3F应该是0xBF。 – jlahd

+1

您需要在该类型转换中使用volatile,否则编译器可能会优化它并且/或者实际上不会触及内存。 –

回答

1

要清除位,就需要AND有补值,即0x40的倒位,即​​。您可以让编译器使用~为您计算值。

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

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

这些值是否独立于内存地址?我的意思是任何时候我想设置任何地址的0x4位,我应该“|”它与0x4和每次我想清除任何地址的第7位我应该“&”它与0xBF –

+0

@alikaveh正确,位掩码独立于您应用它们的地址。 – dasblinkenlight

+0

没关系,你能告诉我关于这个内存地址(例如0x02和0x10位)的切换(如果设置清楚,并且如果设置清除)吗? –

1

我会写这样的方式如下:

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

要清除我喜欢使用按位否定的特定位并逐位,以避免你已经证明的问题。你知道你想清除被0x40掩码的位,所以按位取反会翻转所有位并导致0xbf ...正确的值清除位0x40 ...

1

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

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

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

另请注意,在真正的软件中,应该命名指针和位或位掩码,因为在代码中间的这些幻数会被忽略。

+0

@ starblue,第3位是RUN位,并且将激活定时器(每当其高电平)并且第7位是EXP中断时,通过读取EXP的控制字节,它将被休眠 –