题目:
位运算实例,已知一个正整数变量\(a\),对这个数的二进制数列进行下面的操作,依次使用位运算符号写出操作方式:
1)将最后一位的右边加上一个\(1\),例如\(101\)变为\(1011\)
答:将\(101\)左移一位,然后加\(1\),就是\((a<<1)+1\)
2)将最后一位变为\(0\),例如\(1010\)或者\(1011\)处理后都变成\(1010\)
答:
方法一:最后一位直接变成\(0\) 不太好办,可以直接变成\(1\),然后再想办法减去\(1\)就行了:构造一个数字\(1\),然后用\(a\)与\(1\)进行按位取或
,就把最后一位变成了1
,其它各位保留原来的样子:\((a|1)-1\)
方法二:构造一个前面都是\(1\),最后一位是\(0\)的家伙,然后与原来的数字进行与运算,就可以把最后一位变成\(0\),其它各位不变。那么,什么数字是前面都是1,最后一位是0呢?这就需要单独记忆一下了:\(-2\)的二进制表示就是前面都是1,最后一位是0.
原因:
原码 0010
反码 1101
补码 1110
3)取末5位序列,例如\(1101 1010\)处理后得到\(11010\)
答:构造一个右边5个是1,左边都是0的数,然后两者相与。就是 000...00 11111,而这个前面都是0,后5个是1的数字,就是$ (1<<5)-1$ ,所以表达式:\(n\& ((1<<5)-1)\)
4)去掉序列中最右边的1的左边所有数字,例如1101 1000 取到右边的1000
答:就是保留最右边的那个1,这是位运算的经典方法:\(a \& (-a)\)