C语言中的位操作(7)不用选择分支按条件设置指定值

不使用选择分支语句按条件设置、清除比特位:

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;
作者:xueda120
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
原文地址:https://www.cnblogs.com/xueda120/p/3133337.html