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

简介: 实现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;
}

画图说明:

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. 交换奇偶位

代码实现如下:

#include <stdio.h>
#define SWAP(n)  ((((n) & 0x55555555) << 1 )|((((n) & 0xaaaaaaaa) >> 1 )))
int main()
{
  printf("%d\n", SWAP(13)); //14
  return 0;
}


目录
相关文章
|
7月前
|
C语言
【C语言】库宏offsetof(结构体成员偏移量计算宏)
【C语言】库宏offsetof(结构体成员偏移量计算宏)
64 0
|
C语言
写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换(C语言)
写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换(C语言)
71 0
|
7月前
|
C语言
C语言进阶21收尾(编程练习)(atoi,strncpy,strncat,offsetof模拟实现+找单身狗+宏交换二进制奇偶位)(下)
C语言进阶21收尾(编程练习)(atoi,strncpy,strncat,offsetof模拟实现+找单身狗+宏交换二进制奇偶位)
46 0
|
7月前
|
C语言
C语言进阶21收尾(编程练习)(atoi,strncpy,strncat,offsetof模拟实现+找单身狗+宏交换二进制奇偶位)(上)
C语言进阶21收尾(编程练习)(atoi,strncpy,strncat,offsetof模拟实现+找单身狗+宏交换二进制奇偶位)
117 0
|
7月前
用一行代码(宏)交换一个二进制整数的奇数位和偶数位
用一行代码(宏)交换一个二进制整数的奇数位和偶数位
|
C语言
C语言的offsetof宏模拟和用宏实现交换奇偶位
C语言的offsetof宏模拟和用宏实现交换奇偶位
|
编译器 程序员 Linux
关于c语言结构体偏移的一点思考(一)
关于c语言结构体偏移的一点思考(一)
135 0
|
C语言
关于c语言结构体偏移的一点思考(二)
关于c语言结构体偏移的一点思考(二)
84 0
|
程序员 编译器 Linux
关于c语言结构体偏移的一点思考(一)
关于c语言结构体偏移的一点思考(一)
137 0
|
编译器 Linux 程序员
关于c语言结构体偏移的一点思考
关于c语言结构体偏移的一点思考
139 0