什么是C中的(1 << OCIE0A)?

mug*_*tsu -1 c avr bit-manipulation

我知道OCIE0A=0001二进制,所以(1<<OCIE0A)只是0010?我看到这种情况经常被使用,设置寄存器的原因是什么,(1<<OCIE0A)而不是直接将其设置为0010?

Moo*_*uck 42

从谷歌搜索的结果来看,它似乎是"8位AVR微控制器"的"定时器/计数器中断屏蔽寄存器"*中控制"定时器/计数器输出比较匹配A中断"的位的名称*"*其用法如下*:

TIMSK0 |= _BV(OCIE0A);  // enable compare A interrupts 
TIMSK0 &= ~_BV(OCIE0A); // disable compare A interrupts 
Run Code Online (Sandbox Code Playgroud)

TIMSK0*定时器中断屏蔽寄存器*在哪里? OCIE0A是一个标识符(对于熟悉AVR代码的人*)比TIMSK0 |= 2*更容易理解*.

他们使用位标识符而不是掩码,因为任何halfwit编译器都可以针对bit-> mask将它们优化为相同的东西,但是从mask-> bit开始更难*.因此,通过将其作为bitid,它可以轻松快速地用于所有用途*.

在不相关的注释中,数字是在计算机中以二进制形式存储的值."十进制"和"十六进制"是这些值的表示.所以不,OCIE0A不是"十六进制".它是表示标志位偏移的符号,值为1.

*到处都是假设,我什么都不知道

  • +1使用一个小小的免责声明...... :) (4认同)
  • 作为嵌入式程序员,我完全同意.我讨厌阅读旧代码并找到'config_reg = 0x051C'."哦,我必须再次找到参考手册".看到'config_reg = EN_FIFO |会好得多 EN_INT | WORD_SZ_8;" (3认同)