当前位置: 首页 > news >正文

【C语言题解】1、写一个宏来计算结构体中某成员相对于首地址的偏移量;2、写一个宏来交换一个整数二进制的奇偶位

 🥰欢迎关注 轻松拿捏C语言系列,来和 小哇 一起进步!

 🌈感谢大家的阅读、点赞、收藏和关注

 💕希望大家喜欢我本次的讲解💕

目录👑

1、写一个宏,计算结构体中某变量相对于首地址的偏移,并给出说明。考察:offsetof宏的实现 

2、写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。


1、写一个宏,计算结构体中某变量相对于首地址的偏移,并给出说明。考察:offsetof宏的实现 

offsetof宏的原型如下:

#include <stddef.h>  
size_t offsetof(type, member);

但请注意,实际上offset是一个宏,而不是一个函数。

它接受两个参数:一个结构体类型和一个该类型中的成员名称,并返回该成员在结构体中的字节偏移量。

使用举例:

#include <stdio.h>  
#include <stddef.h>  typedef struct {  int a;  char b;  double c;  
} MyStruct;  int main() {    printf("%zu\n", offsetof(MyStruct, b)); printf("%zu\n", offsetof(MyStruct, c));return 0;  
}

回归题目,

我们可以将0转换成一个结构体类型的指针,相当于这个结构体的首地址为0,所以结构体元素的偏移量就是相对于0的偏移量。

因为首元素地址为0,结构体类型指针指向结构体成员的地址,将该地址强转成size_t类型,就能得到这个偏移量了。

#include<stdio.h>
struct A
{char a;int b;
};
#define OFFSET1(STRUCTtype,member) (size_t)&(((STRUCTtype*)0)->member)//不能用成员指针减结构体起始位置地址的方式去计算偏移量
// #define OFFSET2(STRUCTname,member) (size_t)(&(STRUCTname.member) - &STRUCTname)int main()
{struct A str = { 'a',2024 };printf("%zd\n", OFFSET1(struct A, b));//printf("%zd\n", OFFSET2(str, b));return 0;
}

2、写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。

这里我画了一个图,能够更清楚展示

假设是在32位的环境下,

将一个整数与01010101……(共32位)进行按位与运算,能够将它二进制的奇数位上的0或1保留下来,偶数位上的都变成0;

与10101010……(32位)进行按位与运算,能够将它二进制的偶数位上的0或1保留下来,奇数位上的都变为0;

要想奇数位与偶数位互换,可以将保留下奇数位的二进制进行左移,最右边补0;将保留下偶数位的二进制进行右移,最左边补0;然后进行按位或运算,就能得到交换后的二进制了。

#define Swap(n) (((n&(0x55555555))<<1)|((n&(0xaaaaaaaa))>>1))
int main()
{int n = Swap(11);printf("%d\n", n);return 0;
}

​🎉🎉本次的内容结束啦,希望大家喜欢 能够看懂

😘💕希望大家能够三连支持,你们的鼓励是我前进的动力

🌹🌹谢谢观看!

http://www.lryc.cn/news/366436.html

相关文章:

  • LabVIEW阀性能试验台测控系统
  • Flutter 中的 LayoutBuilder 小部件:全面指南
  • webman中创建udp服务
  • Vue 学习笔记 总结
  • 云计算导论(3)---分布式文件系统
  • 后端进阶-分库分表
  • Apple开发者应用商店(AppStore)描述文件及ADHOC描述文件生成
  • 【Git】修改设置 git 的 username、email
  • python脚本打包为exe并在服务器上设置定时执行
  • STM32-呼吸灯仿真
  • 【AI基础】第三步:纯天然保姆喂饭级-安装并运行chatglm2-6b
  • Spring Security系列之Handler
  • Thinkphp使用Elasticsearch查询
  • 开源日志分析平台ELK实战应用
  • css基本操作及使用
  • SpringBoot+Vue幼儿园管理系统(前后端分离)
  • MFC实现子控件focus焦点上下移动父控件ListView和Gridview也跟着向上下移动
  • 几何关系运算处理
  • http和https分别是什么?区别是什么?
  • 第一周:计算机网络概述(上)
  • 谷歌AI搜索变革,中国引擎能跟上步伐?
  • 【机器学习300问】110、什么是Lasso回归模型?
  • Qt实现麦克风音频输入保存wav文件
  • docker_如何推送镜像到仓库(hub.docker.com)
  • 【Python】认识 Python
  • Vue根据后端返回的tabList动态渲染组件信息
  • 二轴机器人大米装箱机:技术创新引领智能包装新潮流
  • rtl8723DU移植 android4.4 4418 (第二部分蓝牙部分)
  • 【Vue】组件的存放目录问题
  • 开发PlugLink插件:自动生成并发布博客文章