实现offsetof宏以及交换一个整数二进制奇偶位的宏

1. offsetof宏

我们想用宏来实现offsetof函数,首先要了解这个函数的用法。
1.1 offsetof函数的介绍及用法
(1)功能:用来计算结构体中一个成员在该结构体中的相对起始位置的偏移量,单位是字节
(2)函数原型:

offsetof ( type , member )

(3)参数:

type: 结构体类型
member: 结构体成员

(4)使用方法:

#include  <stddef.h>

struct S
{
	int a;
	char b;
	short c;
};

int main()
{
	printf("%zd\n", offsetof(struct S, a)); //0
	printf("%zd\n", offsetof(struct S, b)); //4
	printf("%zd\n", offsetof(struct S, c)); //6

	return 0;
}

画图说明:
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d435898fa94747169f5fb681392c8688.png

1.2 用宏实现offsetof
我们知道,内存中的每个字节都有自己的地址,我们假设上图所示的起始位置的地址为0x0012ff40,往下依次是0x0012ff41,0x0012ff42…,所以每个成员的偏移量可以认为是该变量首地址与起始地址之差

代码实现如下:

#include <stdio.h>

#define OFFSETOF(type,member)  (size_t)&((type*)0)->member

struct S
{
	int a;
	char b;
	short c;
};

int main()
{
	printf("%zd\n", OFFSETOF(struct S, a));
	printf("%zd\n", OFFSETOF(struct S, b));
	printf("%zd\n", OFFSETOF(struct S, c));

	return 0;
}

把整数0强制类型转换成结构体指针类型,再取出该成员的地址,强制类型转换为无符号整型。

2. 交换奇偶位

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/2f68b1c5d94f4efd8e22dab008a156e2.png

代码实现如下:

#include <stdio.h>

#define SWAP(n)  ((((n) & 0x55555555) << 1 )|((((n) & 0xaaaaaaaa) >> 1 )))

int main()
{
	printf("%d\n", SWAP(13)); //14

	return 0;
}

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-02 04:22:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-02 04:22:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-02 04:22:02       82 阅读
  4. Python语言-面向对象

    2024-04-02 04:22:02       91 阅读

热门阅读

  1. EXCEL VBA 计算财务报表透视图计算汇总透视表

    2024-04-02 04:22:02       37 阅读
  2. 【建议收藏】Tomcat 优化总结

    2024-04-02 04:22:02       39 阅读
  3. 2024.4.1exercise

    2024-04-02 04:22:02       35 阅读
  4. pytest中文使用文档----8捕获告警信息

    2024-04-02 04:22:02       34 阅读
  5. Vue中的MVVM

    2024-04-02 04:22:02       42 阅读
  6. C++经典面试题目(十八)

    2024-04-02 04:22:02       34 阅读
  7. 以比特币脚本来实现SNARK Verifier

    2024-04-02 04:22:02       36 阅读
  8. [Golang] RC4加解密

    2024-04-02 04:22:02       38 阅读