不使用选择分支语句按条件设置、清除比特位:
bool f; // 条件标识符 flag unsigned int m; // 比特掩码 unsigned int w; // 需要设置的数字: if (f) w |= m; else w &= ~m; w ^= (-f ^ w) & m; //或者,对于超标量cpu w = (w & ~m) | (-f & m);
C测试代码如下:
1 #include<stdio.h> 2 #include<string.h> 3 4 int main() 5 { 6 bool f; //条件标志 7 unsigned int m; //比特掩码 8 unsigned int w; //待修改的值 9 m=2; //00000010 10 w=4; //00000100 11 f=true;//11111111 12 /* 13 -f:11111111 14 w:00000100 15 ^--------- 16 (-f^w):11111011 17 m:00000010 18 &--------- 19 (-f^w)&m:00000010 20 w:00000100 21 ^--------- 22 00000110 23 */ 24 w ^= (-f ^ w) & m; 25 printf("if f=true then w=%d\n",w); //w=6 26 m=2; //00000010 27 w=4; //00000100 28 f=false; 29 /* 30 -f:00000000 31 w:00000100 32 ^--------- 33 (-f^w):00000100 34 m:00000010 35 &--------- 36 (-f^w)&m:00000000 37 w:00000100 38 ^--------- 39 00000100 40 41 */ 42 w ^= (-f ^ w) & m; 43 printf("if f=false then w=%d\n",w); //w=4 44 getchar(); 45 getchar(); 46 return 0; 47 }
按照制定条件不使用判断分支使一个值无效:
假如你需要当标志符为0的时候使一个值无效,那么可以使用如下的代码:
1 bool fDontNegate; // fDontNegate指示是否处理指定数值. 2 int v; // 当fDontNegate=false的时候,处理指定值使之无效. 3 int r; // result = fDontNegate ? v : -v; 4 5 r = (fDontNegate ^ (fDontNegate - 1)) * v;
假如你需要当标志符为1的时候使一个值无效,那么可以使用如下的代码:
bool fNegate; // fNegate指示是否处理指定数值. int v; // fNegate = true 表示处理指定数值使之无效. int r; // result = fNegate ? -v : v; r = (v ^ -fNegate) + fNegate;