位运算实现int的absminmax函数

    技术2025-09-11  19

     

    From: http://blog.csdn.net/fish_autumn/category/710145.aspx

     

    (假定int4个字节):

    int min(int a, int b)

    {

        int diff = b - a;

        // b < a: a + (diff & -1)

        // b > a: a + (diff &  0)

        return a + (diff & (diff >> 31));

    }

    int max(int a, int b)

    {

        int diff = b - a;

        // b < a: b - (diff & -1)

        // b > a: b - (diff &  0)

        return b - (diff & (diff >> 31));

    }

    int abs(int a)

    {

        int temp = (a >> 31);

        return (a + temp) ^ temp;

    }

     

    原理上主要有两点:

    1, 整数是以补码表示的

    2, 有符号数的移位运算是算数移位(乘2和除2)而非物理移位

     

    正数和0的补码同原码,负数的补码是绝对值的反码加1-1的补码表示是0xFFFFFFFF

     

    任何一个非负整数(0~231-1)右移31位都是0;任何一个负整数(-231~-1)右移31位都是-1。这样minmax就比较容易理解了。

     

    再看abs

    a ^ -1 == ~a

    a ^  0 == a

     

    a非负,没有任何变化;若a为负,加-1再取反,得到绝对值。

     

    最新回复(0)