Chapter 5 | Bit Manipulation

给定一个整数x,找出另外两个整数,这两个整数的二进制表示中1的个数和x相同, 其中一个是比x大的数中最小的,另一个是比x小的数中最大的。

找到x二进制表示右边起第一个1,(x&(-x))
从它开始找到第一个0,然后把这个0变为1, 比这个位低的位全置0。比如1101110,得到1110000,这个数比原数大,但比它少了两个1, 直接在低位补上这两个1,得到,1110011,这就是最终答案

有一些可能没有更大更小同1个数的值,这些边界条件,还有负数也要重新考虑。

for(int x = 1; x <= 20 ; x++)
        cout <<(  x&(-x) )<

输出结果:1 2 1 4 1 2 1 8 1 2 1 4 1 2 1 16 1 2 1 4

写程序计算从整数A变为整数B需要修改的二进制位数。

需要修改的就只是A和B二进制表示中不同的位, 先将A和B做异或,然后再统计结果的二进制表示中1的个数即可。

A xorB in code: (a^b)

写程序交换一个整数二进制表示中的奇数位和偶数位,用尽可能少的代码实现

操作的数为N,用N&0xaaaaaaaa(也就是10101010....)取出偶数位,用N&0x55555555(也就是01010101...)取出奇数位。
偶数位右移一位,奇数位则应该左移一位。
把操作之后的这两部分拼起来(或操作)。

你可能感兴趣的:(Chapter 5 | Bit Manipulation)