面试题之位运算

位运算共有5种:与、或、异或左移和右移。异或,就是两个操作数相同为0,相异为1.符号为”^”。
左移n位(m>>n)表示,最左边的n位被丢弃,同时在最右边补上n个0。右移m>>n, 表示最右边的n位被丢弃,然后分两种情况:如果数字是无符号数,用0填补最左边的n位:如果数字为有符号数,则用数字的符号位填补最左边的n位。具体来说,如果数字是正数,右移之后在最左边补n个0,;如果数字为负数,右移之后在最左边补n个1.

经典面试题
二进制中1的个数。(详见剑指offer面试题15)
最优解法。
把一个整数减去1,再和原整数做与运算,会把该整数最右边的1变成0,那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。代码如下
int NumberOf1(int n)
{
int count=0;
while(n)
{
++count;
n=(n-1)&n;
}
return count;
}
扩展
1、用一条语句判断一个整数是不是2的整数次方,一个整数如果是2的整数次方,则二进制表示中有且只有一位是1,其他位都是0.
2、输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n。解法:先求这两个数的异或,再统计异或结果中1的个数。

猜你喜欢

转载自blog.csdn.net/amychang230_/article/details/81669170