位操作求出integer的绝对值

来源:互联网 发布:ubuntu打开anaconda2 编辑:程序博客网 时间:2024/06/06 18:02

#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。得到将反码取反的效果。

    如果value为正数,这时相当于对value ^ mask,mask这时全为0,所以结果仍然为value,0, 1与0异或都为原数。


此算法来自斯坦福大学,原网址:http://graphics.stanford.edu/~seander/bithacks.html#IntegerAbs


如需转载,请注明来自http://blog.csdn.net/leo524891010



原创粉丝点击