常见位运算的面试题

2019-03-14  本文已影响0人  要记录的Ivan

1. 不用临时变量,交换两个整数?

一个数和另一个数异或两次得到的还是原来的数

例如:

int a=1,b=2;
a=a^b;
b=a^b;
a=a^b;

2. 统计一个整数二进制中1的个数?

n & (n - 1)将整数n的最后一位为1的位变成0
例如:

public  int fun(int num)
{
    int count = 0;
    while(num!=0)
    {
        num = num & (num - 1);
        ++count;
    }
    return count;
}

3. 不使用+,-,*,/完成整数相加

public  int Add(int num1, int num2)
 {
     int sum, carry;
     do{
         //将两个数异或,模拟加法中相加不进位的结果
         sum = num1 ^ num2;
         //只考虑进位的情况
         carry = (num1 & num2) << 1;
         num1 = sum;
         num2 = carry;
     }
     while(num2 != 0); //将结果相加的过程就重复上述过程,直到进位为0

     return sum;
 }

4. 判断一个数字是否为2 的幂次

如果⼀个数字是2 的幂次,那么只有最⾼位为1 ,也就是只需要判断这个数字减掉最⾼位之后是否为0 即可

public boolean log2 (int num){
    if(num & (num-1)){
         return true;
    }else{
        return false;
    }
    return false;
}

5. 给定一个整数,请写一个函数判断该整数的奇偶性

一个数是偶数那么最后一个一定是 0 如果一个数是奇数那么最后一位一定是 1

public boolean isOdd(int num){
    return num & 1 != 0;
}

参考资料

上一篇 下一篇

猜你喜欢

热点阅读