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


目录
打赏
0
0
0
0
7
分享
相关文章
|
10月前
|
【C语言】库宏offsetof(结构体成员偏移量计算宏)
【C语言】库宏offsetof(结构体成员偏移量计算宏)
84 0
写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换(C语言)
写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换(C语言)
84 0
C语言之指针(指针数组以及指针的指针和字符串)
C语言之指针(指针数组以及指针的指针和字符串)
121 0
|
10月前
用一行代码(宏)交换一个二进制整数的奇数位和偶数位
用一行代码(宏)交换一个二进制整数的奇数位和偶数位
C语言的offsetof宏模拟和用宏实现交换奇偶位
C语言的offsetof宏模拟和用宏实现交换奇偶位
关于c语言结构体偏移的一点思考(一)
关于c语言结构体偏移的一点思考(一)
147 0
关于c语言结构体偏移的一点思考(二)
关于c语言结构体偏移的一点思考(二)
93 0
关于c语言结构体偏移的一点思考(一)
关于c语言结构体偏移的一点思考(一)
158 0
关于c语言结构体偏移的一点思考
关于c语言结构体偏移的一点思考
178 0
【C语言】“指针的运算”、“指针与数组
一、指针运算 指针可以进行±整数,指针-指针,还有关系运算,其他的运算会被编译器阻止。 1.指针 + - 整数 对指针进行±的时候一定要注意不要越界访问,不然会产生野指针。