高效bit 位经典操作

  1. 奇偶判断
    只需要判断数字的最后一个比特位是0 还是 1, 只要最后一位为0 都可以表示成 x*2 即 x<<1
    bool is_odd(int i){
    return i&1;
    }
  2. 交换两数
    a 和 b 进行交换 ,一般最常用的是
    c=a;
    a=b;
    b=c;
    又或者,不用第三个变量
    a=a+b;
    b=a-b;
    a=a-b;
    以上翻译成汇编语言可能生成的代码比较多,可以通过异或运算进行交换,依据的原理有两点 1) 一个数和自身异或为0 ; 2)一个数和0异或是自身。
    a=a^b
    b=a^b
    a=a^b
  1. 变换符号
    我们以前学习计算机基础的时候,都知道一个负的二进制数转换成十进制应该是多少,怎么计算? 对,就是对该二进制的bit 位 取反+1 。对于整数转换成负数也是如此。所以对于一个数取反应该就是
    ~a+1

  2. 取绝对值
    int i = a >> 31; //获取符号位
    int abs = (i == 0 ? a : (~a + 1)) ;// 如果i==0 代表是正数,直接返回即可,否则为-1取反。

我们知道一个数和-1 (0xFFFFFFFF)异或就是取反; 和0 异或就是自身, 所以上面求abs的时候可以表示为 (a ^ -1)+1 ; 而 i 不是0 就是-1 ,所以abs 赋值可以进一步优化为 ( a^i)-i 。
所以取反的步骤少了判断,即为 :
int i = a >> 31;
int abs=(a^i)-i;

你可能感兴趣的:(高效bit 位经典操作)