当前位置 博文首页 > dadalaohua的博客:【位操作笔记】根据条件来获取相反数 不使用
根据条件来获取相反数,比如条件为真时得到相反数,或者条件为假时得到相反数。
该算法使用了异或来实现,不使用判断。
当条件为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;
}
第一步,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
不会得到相反数。
第一步,-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