有条件地设置或清除位

时间:2014-06-19 18:54:46

标签: c bit-manipulation

我遇到了一个代码original link of code,其中的部分内容对我来说并不清楚。

bool f;         // conditional flag
unsigned int m; // the bit mask
unsigned int w; // the word to modify:  if (f) w |= m; else w &= ~m; 
w ^= (-f ^ w) & m;
// OR, for superscalar CPUs:
w = (w & ~m) | (-f & m);

现在,在行w ^= (-f ^ w) & m;和行w = (w & ~m) | (-f & m);中,他们使用了-f。当我尝试不使用-f并且只使用f时,它给了我相同的答案。即使我在初始化-f的值后尝试打印f=true/false,它仍保留一些并且不会更改。有人可以告诉我-f这里有什么意义。

2 个答案:

答案 0 :(得分:2)

您引用的代码似乎假设(unsigned int)(-true)将评估为UINT_MAX。 C标准没有这样的保证,(-true)的值可以是二进制表示全为1的任何值,包括值1

但是,通过施法可以解决这个问题。 -(unsigned int)f应该给你正确的答案。

当您将无符号值设置为-1时,会添加最大值+ 1,因此它将成为该类型的最大值,即所有位设置为1的值。-0显然等于0。因此,在上面的第一个表达式中,f的值应该控制(-f ^ w)是评估为~w还是w

答案 1 :(得分:1)

我能够从http://tigcc.ticalc.org/doc/opers.html#unarypm找到这个描述:

  

一元加减运算符('+'和' - ')

     

在这些一元+ - 表达式中

+ expr
- expr
     

expr操作数必须是算术类型。结果是在一元加('+')运算符的任何必需的整数提升之后的操作数的值,或者对于一元减号(' - ')运算符的任何所需的整数提升之后的操作数的负值。使用fneg函数在内部执行浮点否定。

     

请注意,'+'和' - '运算符也有二进制形式。