一个宏将一个整数的二进制位的奇数位和偶数位交换

这里的奇数偶数进行交换是将他的二进制数进行的奇数偶数位进行交换,既然是对二进制进行交换了那大家自然也就想到了按位与按位或这种二进制操作。
0x55555555是十六进制的:01010101010101010101010101010101。
0xaaaaaaaa是十六进制的:10101010101010101010101010101010。

所以开始先将n和0x55555555按位与,求出来n的所有奇数位置的数字,然后将求得的数左移一位,现在的数字就是将n的奇数位的所有内容放到了偶数位置.
这时候只要求出来n的偶数为然后放到奇数位置就可以了,所以先移动n向左移虽然这时候n的32位少了一个0,并不影响, 然后将两个求得的数字进行或运算,就能将这个数字的32位二进制的奇数位和偶数位进行交换。
代码如下:

//宏,将一个整数的二进制位的奇数位和偶数位交换。
#include<stdio.h>
#define FSWAP(N) (((N&0X55555555)<<1)|((N&0xaaaaaaaa)>>1))

int main()
{
	int n = 0;
	printf("请输入一个数字\n");
	scanf("%d", &n);
	printf("%d", FSWAP(n));
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值