位运算优化

<!-- lang: cpp -->
/*位运算优化*/

/*清零
 *当我们希望将一个变量清零时,可以考虑位运算。
 *那么,a^=a和a=0的区别是什么呢?
 *我们观察一下汇编代码:
 *a^=a;的汇编代码是 xorl %eax,%eax(假设有a存在eax里)。这条指令占两个字节。
 *a=0;的汇编代码为 movl $0,%eax。这条指令占五字节。
 *因此,编译器编译的return 0;的汇编代码一般如下
 *xorl %eax,%eax
 *ret
 */
inline void clear(int& a)
{
    a^=a;
}

/*交换两个元素
 *例如:a=5,b=3;
 * a^=b;   a=6
 * b^=a;   b=5
 * a^=b;   a=3
 *注意:实现的时候要保证a和b的地址一定不能相同,否则会出错
 */
void swap(int *a,int *b)
{
    if(a!=b)
    {
        a^=b;
        b^=a;
        a^=b;
    }
}

/*2^n
 */
inline int compute_2_n(const int& n)
{
    int result=1<<n;
    return result;
}

/*乘2的n次方
 *例如:要计算a*8,可以计算a<<3;
 */
inline int compute(int& value, const int& n)
{
    value<<=n;
    return value;
}

/*除2的n次方
 *例如:要计算a/8,可以计算a>>3;
 */
 inline int compute(int& value, const int& n)
{
    value>>=n;
    return value;
}

/*判断奇偶
 */
inline bool check(const int& n)
{
    return n&1;
}

/*计算平均数
 *x=2 (010)
 *y=6 (110)
 *x&y=(010)
 *x^y=(100)
 */
int ave(const int& x, const int& y)
{
    return (x&y)+((x^y)>>1);
}

/*x与a,b中的一个相等,现在要切换另一个*/
int switch_value(const int& x, const int& y) 
{
    return x^=a^b;
}

/*求最大值
 */
int max(const int&x, const int&y)
{
    int m=(x-y)>>31;    //获取x-y是正值还是负值
     return y&m|x&~m;
}

你可能感兴趣的:(位运算优化)