一、
作业标题
交换奇偶位
作业内容
写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。
#define Change_Odd_and_Even(n) (((n&(0xaaaaaaaa))>>1)|((n&(0x55555555))<<1))
int main()
{
int a = 0;
printf("二进制奇偶位交换前,请输入一个数:\n");
scanf("%d", &a);
printf("二进制奇偶位交换后:\n");
printf("%d\n", Change_Odd_and_Even(a));
return 0;
}
二 、
作业标题
offsetof宏
作业内容
写一个宏,计算结构体中某变量相对于首地址的偏移,并给出说明
#define My_offsetof(StructType, MemberName) (size_t)&(((StructType *)0)->MemberName)
//当把数字0转换成指针0时,那么指针0的地址默认是0
//所以(StructType*)0,表示的意思是,0此时是一个结构体指针,该指针的地址是0
//那么&(StructType *)0)->MemberName就是取出结构体中某元素地址
//(size_t)&(((StructType *)0)->MemberName),(size_t)表示将取得的地址转换成对应的字节大小
struct A
{
int a;
char b;
double c;
};
int main()
{
printf("%d\n", My_offsetof(struct A, a));
printf("%d\n", My_offsetof(struct A, b));
printf("%d\n", My_offsetof(struct A, c));
return 0;
}