简直tmd绝了,位运算能被玩出这么多花活。
给个数如2,希望你把它的二进制数偶数位的全部右移动一个。例如以前是011010 现在希望是100101。
怎么做,
((num&0xaaaaaaaa)>>1 | (num&0x55555555)<<1) 直接得到答案。
用0xa来保留偶数位去除奇数位,然后右移动1,用0x5来保留奇数位去除偶数位然后左移动1.这样就告成了。
值得一提的是,python中整数虽然是以补码形式保存的,但是负数特殊,负数输出的是原码的二进制前面加了个负号。所以如果想要用负数进行二进制的位运算,要先把负数&0xffffffff来把所有都置1.