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


目录
相关文章
|
10月前
|
C语言
写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换(C语言)
写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换(C语言)
56 0
|
3月前
|
C语言
C语言---二进制位置0或者置1
C语言---二进制位置0或者置1
|
4月前
|
C语言
【C语言】求一个整数的二进制序列中1的个数的三种方法
【C语言】求一个整数的二进制序列中1的个数的三种方法
36 0
|
C语言
C语言:求两个数二进制中不同位的个数
思路: 总体思路: 把 m 异或 n 后,有几个相异就有几个1,再计算下二进制有几个1即可 (1). 编写函数:number_of_1() ,计算二进制中有几个1。 (2). 在主函数中,把 m ^ n (m 异或 n)的结果作为参数传给 number_of_1() 函数
C语言:求两个数二进制中不同位的个数
|
C语言
【C语言练习】 二进制中1的个数
【C语言练习】 二进制中1的个数
75 0
|
4月前
用一行代码(宏)交换一个二进制整数的奇数位和偶数位
用一行代码(宏)交换一个二进制整数的奇数位和偶数位
|
11月前
|
C语言
C语言的offsetof宏模拟和用宏实现交换奇偶位
C语言的offsetof宏模拟和用宏实现交换奇偶位
|
11月前
|
存储 人工智能 编译器
C语言之(有关%d和%u的有关内容,输出方法)(有符号和无符号在内存中的存储情况)(整形无符号数和有符号数是如何进行计算的,整形无符号数和有符号数在循环中的应用举例)
C语言之(有关%d和%u的有关内容,输出方法)(有符号和无符号在内存中的存储情况)(整形无符号数和有符号数是如何进行计算的,整形无符号数和有符号数在循环中的应用举例)
398 0
运用函数交换两个整型变量
运用函数交换两个整型变量
|
C语言
宏定义设置x二进制序列的第n个比特位为1或者0
宏定义设置x二进制序列的第n个比特位为1或者0
128 0