目录
1.写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。
2.写一个宏,计算结构体中某变量相对于首地址的偏移,并给出说明
1.写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。
#define SWAP(n) (((n&0xaaaaaaaa)>>1)+((n&0x55555555)<<1))
int main()
{
int a = 10;
a=SWAP(a);
printf("%d",a);
return 0;
}
运行结果如下
2.写一个宏,计算结构体中某变量相对于首地址的偏移,并给出说明
2.1offsetof函数
C标准库 #include<stddef.h>
offsetof(type, member_designator)会生成一个类型为size_t的整型常量,它是一个结构体成员相对结构开头的字节偏移量。
成员由member_designator给定,结构名称由type给定。
声明 offsetof(type,member_designator)
该宏返回类型为 size_t 的值,表示 type 中成员的偏移量。
#define OFFSETOF(type, member_designator) (size_t)&(((type*)0)->member_designator)
2.1offsetof 计算变量相当于首地址原理
2.3offsetof模拟实现
#include <stddef.h>
//写一个宏,计算结构体中某变量相对于首地址的偏移,并给出说明
struct Stu
{
int age;
char sex;
double num;
};
#define OFFSETOF(struct_type, name) (size_t)&(((struct_type*)0)->name)
int main()
{
printf("%d\n", OFFSETOF(struct Stu, age));
printf("%d\n", OFFSETOF(struct Stu, sex));
printf("%d\n", OFFSETOF(struct Stu, num));
return 0;
}
结果如下