对于位运算的学习,可以通过位运算替换一些常用操作的使用场景来学习,如奇数偶数判断、两个变量交换、实现加法。如果面试官要求不能使用常规的方法解决,那我们如何想起一些清奇的思路呢?位运算也能起到同样乃至性能更好的效果。
1.奇数偶数判断
if(n % 2 == 1){ //是奇数odd }else{ //是偶数even }
可以使用&位运算
if(n & 1 == 1){ //是奇数 }else{ //是偶数 }
2.两个变量交换
int temp = a; a = b; b = temp;
不使用临时变量
a = a + b; b = a - b; a = a - b; or//使用异或运算^ a = a ^ b; b = a ^ b; a = a ^ b;
如:a是2,其二进制是01,b是3,其二进制是11。
a = a ^ b = 1[]01],b = a ^ b = 2[10],a = a ^ b = 3[11]
3.实现加法
int Add(int a, int b){ return a + b; }
或者搭配使用^和&
int Add(int a, int b){ int sum, carry; do{ sum = a ^ b;//1.使用 ^ 中实现各位相加不考虑进位 carry = (a & b) << 1;//2.考虑进位,先做& 再向左移动一位<< a = sum;//3.保存过程并重复上面两步 b = carry; }while(b != 0); return a; }
举例,如5的二进制是101,17的二进制是10001。相加得到22
以上例子在看书剑指offer和做编程题过程中整理。