//用宏交换一个整数二进制的奇数位和偶数位
//例如:5:0101--》10:1010;
// 9:1001--》 6:0110;
#define swap(N) ((N&(0x55555555))<<1)+((N&(0xaaaaaaaa))>>1)
//按位与01010101.....010101得奇数位数字,右移1个位
//按位与10101010.....101010得偶数位数字,左移1个位
//两者相加,就完成交换
int main()
{
int n = 0;
scanf("%d", &n);
printf("%d\n", swap(n));
return 0;
}
//宏模拟实现offsetof
#define OFFSETOF(struct_type,mem_name) (size_t)&(((struct_type*)0)->mem_name)//传入结构体类型和成员变量名
//将0地址强转为结构体指针,->指向想求偏移量的变量成员,&这个地址并强转为整型,就得到了该成员偏移量
struct S
{
int a;
double b;
long long c;
char d;
};
int main()
{
printf("%d\n", OFFSETOF(struct S, a));//0
printf("%d\n", OFFSETOF(struct S, b));//8
printf("%d\n", OFFSETOF(struct S, c));//16
printf("%d\n", OFFSETOF(struct S, d));//24
return 0;
}