关于位运算的一些问题

来源:互联网 发布:淘宝批准文号已过期 编辑:程序博客网 时间:2024/05/05 23:49

&:按位与,即两位都为1时为1,有一位为0时即为0。

用途:按位与由其特点可以想到,我们可以使其和关闭某位的算法相联系。如x=36,二进制表示为100100,我们想使第三位变为0(从右往左数),此时我们可以让x&59即可。59用二进制表示为111011,即100100&111011。注意我们所取得数的特点,除了第三位为0,其他位都为1,这样既保证了原数的第三位改变,也保证了原数的其他位不变,达到了我们的效果。

再如:树状数组中常用到的 return x&(-x)。x&(-x) 返回的是x的二进制中最后一位1所在的位置表示成十进制的数值。举例来说,若x=8,其二进制表示为1000,则返回值为8,若x=5,二进制表示为101,则返回值为1。在计算机中,数都是以补码的形式存储,其中正数的补码与原码相同,负数的补码为正数的原码按位取反后加1,负数的符号位为1,例如x=5,如果我们用8位存储的话,5的二进制表示为00000101,补码和原码相同,-5的补码为0000101按位取反1111010,再加1,变为1111011,加上符号位为11111011,之后执行按位与操作,00000101&11111011 = 1,即是我们所求得结果。

~:按位取反,0变成1,1变成0

x=10,则~x= -11。而且正整数x按位取反后的结果都为-(x+1)。举例来说,10的二进制表示为00001010,按位取反后变为11110101,第一位是1,说明是负数。由于计算机中都使用补码来表示的,故需要把其转化成原码求其真实值,可知为10001011,为-11。

最近在学状态压缩,由于状态压缩中很多涉及到了位运算,故把碰到的位运算总结一下,也算把以前遗留的一些问题解决了一下。

原创粉丝点击