定义宏,交换二进制整数的奇数位和偶数位

思路

要交换二进制的奇数位和偶数位,可以这么做:
1.取出奇数位,也就是保留奇数位,令偶数位全为0.
2.取出偶数位,也就是保留偶数位,令奇数位全为0.
3.将取出的奇数位左移一位,就得到偶数位了,同理,偶数位右移一位就得到想要的奇数位了.
4.将二者相加,即可得到最终结果

要完成上面的操作需要用到按位与(&)和移位操作符(<< or >>)

假设要交换的数是 int a = 10;
对于1:

a&01010101010101010101010101010101

为了方便,将其转换成16进制,就是

a&0x55555555

同理,对于2:

a&10101010101010101010101010101010

转成16进制

a&0xaaaaaaaa

接下来再进行简单的移位和相加就可以了。

代码展示

#define SWAP(n) ( (((n)&0x55555555)<<1) + (((n)&0xaaaaaaaa)>>1) )
int main()
{
	int a = 10;//1010
	int c = SWAP(a);
	printf("%d\n", c);
	return 0;
}

你可能感兴趣的:(C语言,c语言)