与位运算有关的算法题思路总结

来源:互联网 发布:单片机驱动无源蜂鸣器 编辑:程序博客网 时间:2024/05/17 23:08

位运算是把数字用二进制表示之后,对每一位上0或者1的运算。

理解位运算的第一步是理解二进制。二进制是指数字的每一位都是0或者1.比如十进制的2转换为二进制后是10,而十进制的10转换成二进制是1010。

位运算总共有五种运算:与(&)、或(|)、异或(^)、左移(<<)和右移(>>)。这里重点说一下左移和右移,另外三种运算请详见http://blog.csdn.net/a834352982/article/details/73123911。

左移运算符m<<n表示把m左移n位。左移n位的时候,最左边的n位将被丢弃,同时在最右边补上n个0。比如:
00001010<<2=00101000
10001010<<3=01010000

右移运算符m>>n表示把m右移n位。右移n位的时候,最右边的n位将被抛弃。但右移时处理最左边位的情形要稍微复杂一些。如果数字是一个无符号数值,则用0填补最左边的n位,如果数字是一个有符号数值,则用数字的符号位填补最左边的n位。比如:
00001010>>2=00000010
10001010>>3=11110001

下面是一个关于位运算面试题的总结:
把一个整数减去1之后再和原来的整数做位与运算,得到的结果相当于把整数的二进制表示中的最右边的一个1变成0。

以1100为例,1100减去1之后的结果是1011,把1100和1011做位与运算,得到的结果是1000。把1100最右边的1变成了0,结果刚好是1000。

很多二进制的问题都可以用这个思路解决。比如统计一个数的二进制表示中有几个1、用一条语句判断一个整数是不是2的整数次方(如果一个整数是2的整数次方,那么它的二进制表示有且只有一位是1)。

原创粉丝点击