创建一个循环,切换值并存储新值以进行进一步的计算

时间:2012-04-26 14:36:48

标签: c if-statement toggle bit-manipulation sensor

我试图创建以下循环:

int temp=0x07;

if(left sensor detects){
byteTx((temp)^(1<<0)); //(toggle bit 0)
}

if(right sensor detects){
byteTx((temp)^(1<<2)); //(toggle bit 2)
}

if(front sensor left || front sensor right detects){
byteTx((temp)^(1<<1)); //(toggle bit 1)
}

但是,每个其他if语句都会切换正确的值但重置其他值(因为temp是0x07)。

问题:如何确保我只切换所需的位,并保持其他位置不变,即使它们被其他if语句切换。基本上我想存储输出并使用它来代替temp。

感谢您的帮助,如果您需要更多信息,请与我们联系。

修改

感谢您的回复,但我没有询问如何切换,我问我怎样才能确保切换的值在IF语句之间是一致的。

0x07将继续复位在其他IF语句中切换的其他位,我想确保IF语句不会重置其他位。

实施例

<00> 0000 0111 ^(1 <&lt;&lt; 0)表示输出为0000 0110

但是如果是另一个IF声明:

<00> 0000 0111 ^(1 <1)表示输出为0000 0011

如您所见,结果为0011,这会将第一个语句中的0位变回1.

我该怎样防止这种情况?

4 个答案:

答案 0 :(得分:1)

如果你想在切换后保持切换位,你必须通过写回新状态来修改它。 像这样的东西

if(left sensor detects){
   temp=(temp)^(1<<0); //(toggle bit 0)
   byteTx(temp);
}

在循环结束时,temp将包含所有切换位。

答案 1 :(得分:0)

试试这个:

int temp=0x07;

if(left sensor detects){
    temp ^= 1<<0;
    byteTx(temp); //(toggle bit 0)
}

if(right sensor detects){
    temp ^= 1<<2;
    byteTx(temp); //(toggle bit 2)
}

if(front sensor left || front sensor right detects){
    temp ^= 1<<1;
    byteTx(temp); //(toggle bit 1)
}

答案 2 :(得分:0)

使用异或(^)。

按位异或0,保持旧值
按位XOR,1用于切换旧值

oldvalue ^ 0x01 /* toggle bit 0 */
oldvalue ^ 0x02 /* toggle bit 1 */
...

答案 3 :(得分:0)

您可以使用XOR运算符«^»。