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

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

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

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

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

目录👑

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

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


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

offsetof宏的原型如下:

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

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

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

使用举例:

#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;
}

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

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

🌹🌹谢谢观看!

相关文章:

  • 基于深度学习的CT影像肺癌检测识别
  • JSON及Python操作JSON相关
  • YOLOv5车流量监测系统研究
  • c语言如何改变文件读取位置
  • [线程与网络] 网络编程与通信原理(六):深入理解应用层http与https协议(网络编程与通信原理完结)
  • Python 快速查找并替换Excel中的数据
  • 基于STM32开发的智能家居监控系统
  • C++面向对象程序设计 - 文件操作与文件流
  • Python 树状数组
  • Elasticsearch 认证模拟题 - 8
  • 正则限制字符串的长度必须是n的倍数
  • c++替换字符或字符串函数
  • 【爬虫】使用Python爬取百度学术页面的标题、作者、摘要和关键词
  • 详解大模型微调数据集构建方法(持续更新)
  • ant design form表单动态增减表单项Form.List选中Select值后更新相关联Select选项
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • java8 Stream Pipelines 浅析
  • Linux下的乱码问题
  • Redux系列x:源码分析
  • SQL 难点解决:记录的引用
  • SSH 免密登录
  • 初识MongoDB分片
  • 给新手的新浪微博 SDK 集成教程【一】
  • 机器学习学习笔记一
  • 学习笔记:对象,原型和继承(1)
  •  一套莫尔斯电报听写、翻译系统
  • C# - 为值类型重定义相等性
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • 扩展资源服务器解决oauth2 性能瓶颈
  • 选择阿里云数据库HBase版十大理由
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #Datawhale AI夏令营第4期#AIGC文生图方向复盘
  • #pragma multi_compile #pragma shader_feature
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (10)ATF MMU转换表
  • (3)nginx 配置(nginx.conf)
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (TOJ2804)Even? Odd?
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (一)u-boot-nand.bin的下载
  • (转) 深度模型优化性能 调参
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...