位操作求出integer的绝对值

该博客介绍了一种利用位操作快速求出整数(integer)绝对值的方法。首先,通过向左移动31位创建一个mask,对于负数,mask变为全1;对于正数,mask为全0。接着,将value与mask相加,负数相当于减1,正数不变。最后,进行异或操作,负数得到其反码并再次取反得到绝对值,正数保持不变。这种方法来源于斯坦福大学,并附有原始链接。
摘要由CSDN通过智能技术生成

#include <iostream>

int GetAbsoluteValue(int value)
{
    int mask = value >> sizeof(int) - 1;
    return (value + mask) ^ mask;
}


int main()
{
    int res = GetAbsoluteValue(-4);
    std::cout << res << std::endl;
    return 0;
};

步骤:

1. 将value移动31位,得到mask,

    如果是负数则变为全1,(负数右移补0)1111....1111。

    如果为正数则变为全0,0000....0000。


2. 将value + mask。

    如果value为负数,则为value - 1。(1111....1111是-1)举个例子,假如是-5的话,减去1,就得到了5的反码,因为-5是5的反码加上1得来的。

    如果value为正数,仍然得到value。


3. 异或操作 (value + mask) ^ mask。

    如果value为负数,这时候要对(value + mask) 取反,mask这时也为全1,所以(value + mask) ^ mask,因为0于1异或为1,1与1异或为0。得到将反码取反的效果。

    如果val

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值