面试之路(26)-面试相关的位运算总结
java,位运算,面试,算法2016-06-26
Java提供的位运算符有:左移( << )、右移( >> ) 、无符号右移( >>> ) 、位与( & ) 、位或( | )、位非( ~ )、位异或( ^ ),除了位非( ~ )是一元操作符外,其它的都是二元操作符。
实现函数,输入一个整数,求二进制表示中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的数目
参考博客链接:
http://blog.csdn.net/xiaochunyong/article/details/7748713
剑指offer