当前位置 博文首页 > dadalaohua的博客:【位操作笔记】根据条件来获取相反数 不使用

    dadalaohua的博客:【位操作笔记】根据条件来获取相反数 不使用

    作者:[db:作者] 时间:2021-07-27 14:48

    根据条件来获取相反数 不使用分支判断

    根据条件来获取相反数,比如条件为真时得到相反数,或者条件为假时得到相反数。

    算法说明

    该算法使用了异或来实现,不使用判断。

    实现代码

    当条件为false时,返回相反数。相当于fDontNegate ? v : -v;

    int Conditionally_negate_a_value_false(int val, bool fDontNegate)
    {
        return (fDontNegate ^ (fDontNegate - 1)) * val;
    }
    

    当条件为true时,返回相反数。相当于fNegate ? -v : v;

    int Conditionally_negate_a_value_true(int val, bool fNegate)
    {
        return (val ^ -fNegate) + fNegate;
    }
    

    算法计算过程

    当条件为false时,返回相反数

    第一步,fDontNegate - 1。

    当fDontNegate 为true时,1 - 1 = 0;

    当fDontNegate 为false时,0 - 1 = -1;

    第二步,fDontNegate ^ (fDontNegate - 1)。

    当fDontNegate 为true时,1 ^ 0 = 0;

    当fDontNegate 为false时,0 ^ -1 = -1;

    第三步,* val

    当fDontNegate 为true时,1 × val = val;

    当fDontNegate 为false时,-1 × val = -val;

    实现当条件为false时,返回相反数。

    计算示例

    假设x = 10 ,条件为false

      (0 ^ (0 - 1)) * 10
    = (0 ^ -1) * 10
    = -1 * 10
    = -10
    

    得到相反数-10。

    假设x = 10 ,条件为true

      (1 ^ (1 - 1)) * 10
    = (1 ^ 0) * 10
    = 1 * 10
    = 10
    

    不会得到相反数。

    当条件为true时,返回相反数

    第一步,-fNegate。

    当fNegate为true时, 等于-1 ;

    当fNegate为false时,等于0;

    第二步,val ^ -fNegate。

    当fNegate为true时,val ^ -1 = ~val,等于val的值取反;

    当fNegate为false时,val ^ 0 = val;

    第三步,+ fNegate

    当fNegate为true时,~val + 1 = -val,取反加1得到相反数;

    当fNegate为false时,val + 0 = val;

    计算示例

    假设x = 10 ,条件为false

      (10 ^ -0) + 0
    = (10 ^ 0) + 0
    = 10 + 0
    = 10
    

    不会得到相反数。

    假设x = 10 ,条件为true

      (10 ^ -1) + 1
    = -11 + 1
    = -10
    

    得到相反数-10。

    实现当条件为true时,返回相反数。


    [参考资料]

    Bit Twiddling Hacks By Sean Eron Anderson


    本文链接:https://blog.csdn.net/u012028275/article/details/113280128

    cs