一、计算结构体成员变量的偏移地址
1、思路分析
对于这个题目,首先用#define定义的宏应该要包含两个参数,一个是结构体变量,另一个是该结构体的成员,因为计算的是偏移量,要用变量的地址减去结构体变量的首地址,那么我们可以假设结构体变量的初始地址为0。
2、代码实现
#include<stdio.h> #define OFFSET(S,name) (int)(&(((struct S*)0)->name)) struct S { char name[10]; int age; double score; }; int main() { int n = OFFSET(S, age); printf("%d\n", n); return 0; }
运行结果:
二、将一个整数的二进制位的奇数位和偶数位交换
1、思路分析
将一个二进制数进行代码交换,可以将二进制数的奇数位右移,偶数位左移,然后进行相加就可以实现该功能,那么怎么得到奇数位或者偶数位呢?
想要得到奇数位,可以对原来的数字与10101010(以8位为例)
那么得到偶数位,就对原来的数字与01010101(以8位为例)
然后在对偶数位左移,奇数位右移再相加就可以得到了。
2、代码实现
#include<stdio.h> #define SWAP(n) ((n&(0x55555555))<<1|(n&(0xaaaaaaaa))>>1) int main() { printf("%d\n", SWAP(4)); return 0; }
运行结果: