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

来源:互联网 发布:蚌埠学院网络 编辑:程序博客网 时间:2024/06/13 22:02

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.这个思路可以解决很多的问题

我的微信二维码如下,欢迎交流讨论

这里写图片描述

欢迎关注《IT面试题汇总》微信订阅号。每天推送经典面试题和面试心得技巧,都是干货!

微信订阅号二维码如下:

这里写图片描述

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

2 1