宏的实现(两道王炸试题详解)

在编程中,可能宏对于我们友友们有些陌生,今天阿博通过两道经典例题帮友友们重新认识它

宏的实现(两道王炸试题详解)_第1张图片

一.offsetof宏的实现

二.写一个宏,可以将一个整数的二进制的奇数位和偶数位交换

一.

offsetof的功能是什么呢?
宏的实现(两道王炸试题详解)_第2张图片

它其实计算的就是在某个给定的类型中成员偏移量的大小

代码测试

#include
#include
struct S
{
	int a;
	char c;
	double d;
};
int main()
{
	printf("%d\n", offsetof(struct S, a));
	printf("%d\n", offsetof(struct S, c));
	printf("%d\n", offsetof(struct S, d));
	return  0;
}

图解分析
宏的实现(两道王炸试题详解)_第3张图片
宏的实现(两道王炸试题详解)_第4张图片
模拟实现offsetof宏的逻辑分析

宏的实现(两道王炸试题详解)_第5张图片
代码实现

struct S
{
	int a;
	char c;
	double d;
};
#define  OFFSETOF(type,name)     (size_t)&(((type*)0)->name)         //把起始地址设为0,地址-0还是地址,那么这个地址就是它的偏移量
int main()
{
	struct S s;
	printf("%d\n", OFFSETOF(struct S, a));
	printf("%d\n", OFFSETOF(struct S, c));
	printf("%d\n", OFFSETOF(struct S, d));
	return  0;
}

宏的实现(两道王炸试题详解)_第6张图片

二.

代码逻辑实现

宏的实现(两道王炸试题详解)_第7张图片

代码实现

//写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。
#define SWAP_BIT(x)     (x=(((x&0x55555555)<<1)+((x&0xaaaaaaaa)>>1)))
int main()
{
	int a = 5;
	SWAP_BIT(a);
	printf("%d\n", a);
	return  0;
}

补充说明
宏的实现(两道王炸试题详解)_第8张图片
宏的实现(两道王炸试题详解)_第9张图片
宏的实现(两道王炸试题详解)_第10张图片

好了,友友们,今天的内容到这里就结束了,如果感觉有帮助的话,可以给阿博点个关注哦,后续继续给友友们分享干货知识

你可能感兴趣的:(c++,c语言)