对于位运算的学习,可以通过位运算替换一些常用操作的使用场景来学习,如奇数偶数判断、两个变量交换、实现加法。如果面试官要求不能使用常规的方法解决,那我们如何想起一些清奇的思路呢?位运算也能起到同样乃至性能更好的效果。

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和做编程题过程中整理。