C移零或按零移位

C移零或按零移位,c,bit-shift,C,Bit Shift,我正在学习程序AVR uCs 示例代码段包含以下行: DDRC |= (0 << 0) | (0 << 1); // PIN C0, C1 as input for buttons DDRC |=(0代码不起任何作用,可能是错误的 作者的意思可能是 DDRC |= (1 << 0) | (1 << 1); 它读取DDRC,设置最底部的两位,然后写回该值。使用移位零的语法没有多大作用。它们的意思是1@JanDvorak:有时,在写入硬件时,移位零

我正在学习程序
AVR uCs

示例代码段包含以下行:

DDRC |= (0 << 0) | (0 << 1); // PIN C0, C1 as input for buttons

DDRC |=(0代码不起任何作用,可能是错误的

作者的意思可能是

DDRC |= (1 << 0) | (1 << 1);

它读取DDRC,设置最底部的两位,然后写回该值。使用
移位零的语法没有多大作用。它们的意思是
1@JanDvorak:有时,在写入硬件时,移位零是为了明确地清除位,并使修改代码以设置位更容易。@Skizz本身,或ing零不能清除位。事实上,只有在前面有一行
DDRC=0;
时,这条语句才有意义。@JanDvorak:Hmmm,也许我用错了词。我不应该说“清除”,而应该说“不设置”。过去在编写低级硬件接口代码时,我看到宏设置为允许代码like
hardware_reg=(如果您想将这两位设置为零,则代码上的RHS可能完全正确。移位的RHS通常命名为常量,有点像
(1不,因为位与前一个值一起被或运算。是的,但我们没有前面的代码,它可能是
int DDRC=0;
或设置其他位的结果。确实如此,但我强烈怀疑这是一个硬件寄存器。@Skizz您的第一个评论有点误导,这行没有清除任何位,除非有更多的代码看不见?这没有多大意义。它不会设置位,当然这与清除位不是一回事。
DDRC |= (1 << 0) | (1 << 1);
DDRC |= 3;
DDRC &= ~( (1 << 0) | (1 << 1) );