将位值从一个变量复制到另一个变量

时间:2016-07-01 16:13:11

标签: c mingw

我想在名为TCCR0B的寄存器中设置或清除位号3,具体取决于名为'mode'的变量中位号2的值。如果第2位为高电平模式,则必须在不干扰其他位的情况下设置TCCR0B中的第3位。如果模式中的位2为低电平,我想清除TCCR0B中的第3位。基本上我想将一位复制到其他位。我认为这很简单,但现在我觉得我们需要有条件的声明才能做到这一点。我不确定我是否使这段代码变得复杂。有没有简单的方法来实现这一目标?我写了下面的代码来测试这个。

#define WGM02 3
#define WGM02_IN_MODE 2

int main (void)
{
    unsigned int TCCR0B;
    unsigned int mode;
    while(1)
    {
        printf("enter the TCCRB\n");
        fflush(stdin);
        scanf("%X",&TCCR0B);
        printf("TCCRB = %x\n",TCCR0B);
        fflush(stdin);
        printf("enter the mode\n");
        scanf("%X",&mode);

        mode=((mode>>WGM02_IN_MODE)&0x01);
        if(mode)
        {
            TCCR0B = (TCCR0B & ~(1<<WGM02))  | (mode<<WGM02);
        }
        else
        {
            TCCR0B = (TCCR0B & ~(1<<WGM02))  & ~(mode<<WGM02);
        }
        printf("TCCRB = %x\n",TCCR0B);
    }

}

编辑:我查看了How do you set, clear, and toggle a single bit?中的帖子。但它与设置单个位的清除等有关,而不是从一个位复制到另一个。

1 个答案:

答案 0 :(得分:0)

假设:

#define TCCR0B_WGM02_MASK (1 << 3)
#define MODE_WGM02_MASK   (1 << 2)

然后:

TCCR0B = (mode & MODE_WGM02_MASK)) == 0 ?  // If mode WGM02 bit is zero...
         TCCR0B & ~MODE_WGM02_MASK :       // clear WGM02 in TCCR0B,
         TCCR0B | MODE_WGM02_MASK ;        // otherwise set WGM02 in TCCR0B.