float 型变量与 -0.0 做异或运算结果是取反

/ sum-of-square * theta, use this trick to avoid a division 
t = _mm_mul_ps(_mm_sqrt_ps(_s), _mm_set_ps1(theta)); // float theta = 2 / sqrt(float(dim)); //r0 := r1 := r2 := r3 := w

// - sum-of-square * theta 
t2 = _mm_xor_ps(_t, _mm_set1_ps(-0.f));

在最近看的代码里有一段上面这样的运算 
先求出t1,再让t1 与 -0 做异或运算 ,得到的t2 是t1 的反数。 
c 语言表示如下 
float t = 0.123456 
float t2 =t1^(-0.0)

看下异或运算的定义 
按位异或 若参加运算的两个二进制位值相同则为0,否则为1 
也就是说 如果安位与0异或,原值不变,与1异或,原值取反。

float 型第1位是符号位 
-0.0 的第1位是1 ,其余位是0. 
这样 这个float 和-0.0异或的结果就是第1位取反,其他保持不变。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值