#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define SWAP_BIT(n) (n = ((n & 0xaaaaaaaa) >> 1)+((n & 0x55555555) << 1))
int main()
{
int n = 0;
scanf("%d", &n);
SWAP_BIT(n);
printf("%d\n", n);
return 0;
}/*#define SwapIntBit(n) (((n) & 0x55555555) << 1 | ((n) & 0xaaaaaaaa) >> 1)
交换奇偶位,需要先分别拿出奇偶位。既然是宏,分别拿出用循环不是很现实,那就用&这些位
的方式来做。奇数位拿出,那就是要&上010101010101……,偶数位拿出,就是
要&上101010101010……,对应十六进制分别是555……和aaa……,一般我们默认是32位整数,
4位对应一位16进制就是8个5,8个a。通过& 0x55555555的方式拿出奇数位和& 0xaaaaaaa的方式
拿出偶数位。奇数位左移一位就到了偶数位上,偶数位右移一位就到了奇数位上,最后两个数字
或起来,就完成了交换。
※这个宏只能完成32位以内的整形,要想完成64位的,那就将5和a的数量翻倍即可。
简单点解释
奇数位和1按位与不会变,与0按位与就会变成0。偶数位也一样。所以上述方式就可以把奇数位和
偶数位拿出来。因为移位后奇数位的数就跑到了偶数位,偶数位的数就跑到了奇数位上。而且移位
后相加时,偶数位的数变到奇数位后加上另一个数的对应的数是0。
奇数位(从右往左一次是0、1、2、3位)
0101
& 1010
0000>>1
0000
偶数位
0101
& 0101
0101<<1
1010
最后
0000
+ 1010
== 1010
*/
交换一个用二进制形式表示的数的奇偶位
原创
©著作权归作者所有:来自51CTO博客作者EddieLai的原创作品,请联系作者获取转载授权,否则将追究法律责任

提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
javascript动态生成表单 js动态生成checkbox
:JS动态添加checkbox实现多选框只能选一个
checkbox 多选框选一个 html