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;

 

转载于:https://www.cnblogs.com/xueda120/archive/2013/06/12/3133337.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值