欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

写一个宏,计算结构体中某变量相对于首地址的偏移和写一个宏,可以将一个整数字的奇数位和偶数位交换

程序员文章站 2024-02-29 11:13:04
...

写一个宏,可以将一个整数字的奇数位和偶数位交换

分析:
整数那么就是4字节,要把奇数位和偶数位交换,
把当前整数n的基数位左移1位,但是怎么样,能得到整数n的奇数位呢?
那么我们就可以想到&位运算符,0x55555555 => 01010101 01010101…
便(n&0x55555555)<<1 这样便可以得到整数n的奇数位左移1位

同理可得:也需要把偶数位右移1位
便(n&0xAAAAAAAA)>>1 这样便可以得到整数n的偶数位右移1位
最后我们再把奇数位左移的结果和偶数位右移的结果用 | 位运算得出最终结果
便:(((n&(0x55555555))<<1)|((n&(0xAAAAAAAA))>>1))
注意:因为宏定义的,是在预处理阶段,只是文本替换,没有判断运算符的优先级,所以尽量需要加()就一定要加上,不然会出错误
例如 : #define MUL(a,b) ab
如果是MUL(1+1,1+1) -> 1+1
1+1就等于3

//写一个宏,可以将一个整数字的奇数位和偶数位交换
//把n的二进制中奇数位和偶数位互换,左边是n的奇数位左移一位,右边是n的偶数位右移一位,两者|,便是最后结果
#define CHANGE(n) (((n&(0x55555555))<<1)|((n&(0xAAAAAAAA))>>1))

写一个宏,计算结构体中某变量相对于首地址的偏移,并给出说明

分析:
A:我们可以知道,结构体变量的地址就是结构体中第一个变量的地址,偏移量为0,
B:所以我们如果要求结构体中的变量的偏移量,便可以和结构体变量地址相减即可,
C:最后转成char*类型,那便是最后偏移了多少个字节

/*
structur:结构体变量的地址,也就是首地址	例如结构体变量p,传参传&p
variable:需要求结构体中偏移量的那变量	例如结构体变量p,传参传&p.结构体中某变量名
把上面两个地址,强转成char*类型,然后(char*)variable-(char*)structur,便可算出variable的偏移量
*/
#define OFFSETOF(variable,structur) (((char*)variable)-((char*)structur))
例如:
typedef struct Person{
char a;
int b;
double c;
}person;
//定义一个结构体变量
person p;
printf("偏移量:%d\n",OFFSETOF(&p.c,&p))	//结构体中c的偏移量为8