题目:
位运算实例,已知一个正整数变量(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))