面试之路(26)-面试相关的位运算总结

java的位运算介绍:

Java提供的位运算符有:左移( << )、右移( >> ) 、无符号右移( >>> ) 、位与( & ) 、位或( | )、位非( ~ )、位异或( ^ ),除了位非( ~ )是一元操作符外,其它的都是二元操作符。

  • 左移低位补零
  • 正数右移,高位用0补,负数右移,高位用1补,当负数使用无符号右移时,用0进行部位(自然而然的,就由负数变成了正数了)

面试题举例:

实现函数,输入一个整数,求二进制表示中1
的个数?

解法一:(避免死循环)

思路分析:

首先想到将n循环右移,和1做与运算。考虑n’是负数的情况,右边补1,会出现死循环。
所以采用将1左移和n做位运算

int numberOf1(int n){
    int count = 0;
    int flag = 1;
    while(flag != 0){
        if(flag & n != 0){
        count++;
        }
        flag = flag << 1;
    }
    return count;
}

优雅的解法:

思路分析:

一个数不等于0,那么至少有一位是1,假设最右边那位是1.
减一之后,最后一个1变成0,后面的0变为1,不是一个1的也是这种情况。
举个例子,1100,减一1011,。一个数字和它的减一做位运算,相当于把他的最后边的那个1,变成0.

代码

int numberOf1(int n){
    int count = 0;
    while( n != 0){
        count++;
        n = n & (n-1);
    }
    return count;
}

相关的面试题:

一:

判断一个数字是不是2的整数次方?

思路:

2的整数次方,二进制中只有一个1

二:

输入两个数字m,n,需要改变m的多少位,才能得到n?

思路:

先异或,后判断结果中1的数目

位运算总结:

一个数和它的减一数字,做位与,相当于把这个数字二进制最右边的1变为0.这个思路可以解决很多的问题

参考博客链接:
http://blog.csdn.net/xiaochunyong/article/details/7748713
剑指offer

你可能感兴趣的:(java,位运算,算法,面试)