通过宏定义解决编程难题

大家好,我们今天来通过我们的define定义宏解决C语言上的难题。

实例一:

offsetof这个宏我们在学习结构体的时候就已经了解过了,这个宏是我们在计算结构体大小的时候来查看每个结构体成员的偏移量的,那么我们在这里就来模拟实现一下这个宏。

c 复制代码
#define offsetof(StructType, MemberName) (size_t)&(((StructType *)0)->MemberName)

我们首先要知道StructType是结构体类型名,MemberName是成员名 。然后进行操作:

1、先将0转换为一个结构体类型的指针,相当于某个结构体的首地址是0。此时,每一个成员的偏移量就成了相对0的偏移量,这样就不需要减去首地址了。

2、对该指针用->访问其成员,并取出地址,由于结构体起始地址为0,此时成员偏移量直接相当于对0的偏移量,所以得到的值直接就是对首地址的偏移量。

3、取出该成员的地址,强转成size_t并打印,就求出了这个偏移量。

实例二:

交换奇偶位,需要先分别拿出奇偶位。既然是宏,分别拿出用循环不是很现实,那就用&这些位的方式来做。奇数位拿出,那就是要&上010101010101......,偶数位拿出,就是要&上101010101010......,对应十六进制分别是555......和aaa......,一般我们默认是32位整数,4位对应一位16进制就是8个5,8个a。通过& 0x55555555的方式拿出奇数位和& 0xaaaaaaa的方式拿出偶数位。奇数位左移一位就到了偶数位上,偶数位右移一位就到了奇数位上,最后两个数字或起来,就完成了交换。

接下来看到我们的代码:

c 复制代码
#define SwapIntBit(n) (((n) & 0x55555555) << 1 | ((n) & 0xaaaaaaaa) >> 1)
相关推荐
麻瓜老宋12 小时前
AI开发C语言应用按步走,表达式计算器calc的第二十四步,结束开发,生成calc 用法指南
c语言·开发语言·atomcode
0x3F(小茶)13 小时前
STM32 SPI的5种方向模式
c语言·stm32·单片机·嵌入式硬件
冻柠檬飞冰走茶14 小时前
PTA基础编程题目集 7-19 支票面额(C语言实现)
c语言·开发语言·数据结构·算法
caishenzhibiao15 小时前
顺势交易矩阵主图 同花顺期货通指标
java·c语言·c#
不正经学生16 小时前
二叉树递归遍历:先根与后根,递归思维的最佳试炼场
c语言·开发语言·数据结构·算法·蓝桥杯
冻柠檬飞冰走茶17 小时前
PTA基础编程题目集 7-17 爬动的蠕虫(C语言实现)
c语言·开发语言·数据结构·算法
麻瓜老宋1 天前
AI开发C语言应用按步走,表达式计算器calc的第二十二步,分号赋值链式修复、TOKEN_ASSIGN
c语言·开发语言·atomcode
SilentSlot1 天前
【C/C++】手写 DPDK 协议栈(十一):基于 PPS、SYN 比例和源 IP 熵的 DDoS 检测
c语言·c++·tcp/ip
冻柠檬飞冰走茶1 天前
PTA基础编程题目集 7-15 计算圆周率(C语言实现)
c语言·开发语言·数据结构·算法
Rabitebla2 天前
C++ 内存管理全面复习:从内存分布到 operator new/delete
java·c语言·开发语言·c++·算法·leetcode