- 奇偶判断
只需要判断数字的最后一个比特位是0 还是 1, 只要最后一位为0 都可以表示成 x*2 即 x<<1
bool is_odd(int i){
return i&1;
} - 交换两数
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
变换符号
我们以前学习计算机基础的时候,都知道一个负的二进制数转换成十进制应该是多少,怎么计算? 对,就是对该二进制的bit 位 取反+1 。对于整数转换成负数也是如此。所以对于一个数取反应该就是
~a+1取绝对值
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;