zoukankan      html  css  js  c++  java
  • 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
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    angular4浏览器兼容问题
    angular4组件生命周期
    angular4路由
    CDH 安装配置指南(Tarball方式)
    nginx-1.14.0安装
    redis-3.0.6安装
    CDH安装kafka
    CDH配置JAVA_HOME
    ntp集群时间同步
    VMware联网
  • 原文地址:https://www.cnblogs.com/xueda120/p/3133337.html
Copyright © 2011-2022 走看看