通过位运算高效求绝对值

在阅读某段源码的时候读到了这么一段求绝对值的代码:


function fastAbs(value)//求绝对值
{
    return (value ^ (value >> 31)) - (value >> 31);
}

然后在查阅资料后得到了原理:
对于32位机,

如果value是正数,右移31位之后就变成了0x00000000,

    value和0x00000000异或,仍然是value,

    异或之后的value-0x00000000仍然是value,

    这样就完成了

如果value是负数,右移31位就变成了0xffffffff,

    value和0xffffffff异或,变成了value连着符号位全部取反,也就是实现了补码取反,

    补码取反-0xffffffff也就是补码取反再+1,是就上就对应着value的绝对值,

    因为这里value和value的绝对值实际上只有最高位,也就是符号位不同,

    这样移位就可以将最高位的符号位1变成0,实现绝对值的快速计算。

附原码、补码、反码的计算:

    正数的原码、补码、反码都一样,负数的原码在正数的基础上将最高位改为1,而负数的反码是其原码除符号位外所有位取反,负数的补码是其反码加1,+0(正0)的原码、补码、反码都是0x00000000,-0(负0)的原码为1000 0000 0000 0000 0000 0000 0000 0000,-0(负0)的反码为1111 1111 1111 1111 1111 1111 1111 1111,补码为0000 0000 0000 0000 0000 0000 0000 0000。也就是实际上+0和-0的原码反码是不一样的,在计算机中数字的存储形式为补码。
--------------------- 

原文:https://blog.csdn.net/qq_35580883/article/details/78318142 
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值