一、模拟实现offsetof宏
offsetof (type,member)是用来计算结构体中成员偏移量的宏。
设计宏参数:结构体名,结构体成员名
内部实现:将0强制类型转化为这个结构体的类型的地址,这就相当于在0地址处存放了一个结构体,再找到0地址处结构体内成员的地址,这个成员的地址就是这个成员偏移量的大小。
//offsetof宏实现
#define OFFSETOF(type,member) (int)&(((type*)0)->member)
struct S
{
char c1;
int a;
char c2;
};
int main()
{
printf("%d\n", OFFSETOF(struct S,c1));
printf("%d\n", OFFSETOF(struct S, a));
printf("%d\n", OFFSETOF(struct S, c2));
return 0;
}
二、写一个宏交换奇偶位
在计算机中每一个整数都可以用32个0或1来表示,要交换一个数的奇偶位,则必须要分别保存它的奇偶位然后再进行交换才可。
那么要如何分别保存奇偶位呢,请看下面的内容。
1.保存奇数位
0xaaaaaaaa = 10101010101010101010101010101010
我们用这个数 & 0xaaaaaaaa就可以得到这个数的所有偶数位,且奇数位位0,因为&的特点是两个二进制位都为1才为1,否则为0。然后再将其算术右移一位,左边补一个0,偶数位就到达奇数位上了。
2.保存偶数位
0x55555555 = 01010101010101010101010101010101
我们用这个数 &0x55555555就可以得到这个数的所有奇数位,且偶数位位0,再将其算术左移一位,右边补0,则奇数位就到达偶数位了。
完成这两步后相加就是交换奇偶位后的结果了。
#define ODD_TO_EVEN(x) (((x&0xAAAAAAAA)>>1)+((x&0x55555555)<<1))
int main()
{
int x = 10;
int y = ODD_TO_EVEN(x);
printf("%d\n", y);
return 0;
}
以上就是今天的内容了,希望对大家有所帮助。