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

本文主要是介绍【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;
}

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

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

🌹🌹谢谢观看!

这篇关于【C语言题解】1、写一个宏来计算结构体中某成员相对于首地址的偏移量;2、写一个宏来交换一个整数二进制的奇偶位的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1041664

相关文章

C语言中联合体union的使用

本文编辑整理自: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=179471 一、前言 “联合体”(union)与“结构体”(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量

计算绕原点旋转某角度后的点的坐标

问题: A点(x, y)按顺时针旋转 theta 角度后点的坐标为A1点(x1,y1)  ,求x1 y1坐标用(x,y)和 theta 来表示 方法一: 设 OA 向量和x轴的角度为 alpha , 那么顺时针转过 theta后 ,OA1 向量和x轴的角度为 (alpha - theta) 。 使用圆的参数方程来表示点坐标。A的坐标可以表示为: \[\left\{ {\begin{ar

二进制文件转化成文本文件

文章中如果有写错、表述不明、有疑问或者需要扩展的知识,欢迎留言或者私信~   1.区别 如果一个文件说是文本文件,使用任何一种文本编辑器打开可以展现出人类可读信息字符,因为编码都符合某种编码方式,如ASCII、UTF8、GB2312等等(在文件头可以读出来是什么编码方式,然后文本编辑器再按照规则去读取翻译成对应的字符,展示给我们的就是可读的了)。(关于编码方式不了解可以看这一篇) 如果一

JAVA读取MongoDB中的二进制图片并显示在页面上

1:Jsp页面: <td><img src="${ctx}/mongoImg/show"></td> 2:xml配置: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001

大语言模型(LLMs)能够进行推理和规划吗?

大语言模型(LLMs),基本上是经过强化训练的 n-gram 模型,它们在网络规模的语言语料库(实际上,可以说是我们文明的知识库)上进行了训练,展现出了一种超乎预期的语言行为,引发了我们的广泛关注。从训练和操作的角度来看,LLMs 可以被认为是一种巨大的、非真实的记忆库,相当于为我们所有人提供了一个外部的系统 1(见图 1)。然而,它们表面上的多功能性让许多研究者好奇,这些模型是否也能在通常需要系

LeetCode11. 盛最多水的容器题解

LeetCode11. 盛最多水的容器题解 题目链接: https://leetcode.cn/problems/container-with-most-water 示例 思路 暴力解法 定住一个柱子不动,然后用其他柱子与其围住面积,取最大值。 代码如下: public int maxArea1(int[] height) {int n = height.length;int

通过高德api查询所有店铺地址信息

通过高德api查询所有店铺地址电话信息 需求:通过高德api查询所有店铺地址信息需求分析具体实现1、申请高德appkey2、下载types city 字典值3、具体代码调用 需求:通过高德api查询所有店铺地址信息 需求分析 查询现有高德api发现现有接口关键字搜索API服务地址: https://developer.amap.com/api/webservice/gui

人工和AI大语言模型成本对比 ai语音模型

这里既有AI,又有生活大道理,无数渺小的思考填满了一生。 上一专题搭建了一套GMM-HMM系统,来识别连续0123456789的英文语音。 但若不是仅针对数字,而是所有普通词汇,可能达到十几万个词,解码过程将非常复杂,识别结果组合太多,识别结果不会理想。因此只有声学模型是完全不够的,需要引入语言模型来约束识别结果。让“今天天气很好”的概率高于“今天天汽很好”的概率,得到声学模型概率高,又符合表达

时间服务器中,适用于国内的 NTP 服务器地址,可用于时间同步或 Android 加速 GPS 定位

NTP 是什么?   NTP 是网络时间协议(Network Time Protocol),它用来同步网络设备【如计算机、手机】的时间的协议。 NTP 实现什么目的?   目的很简单,就是为了提供准确时间。因为我们的手表、设备等,经常会时间跑着跑着就有误差,或快或慢的少几秒,时间长了甚至误差过分钟。 NTP 服务器列表 最常见、熟知的就是 www.pool.ntp.org/zo

C语言 将“China”译成密码

将“China”译成密码,密码规律是:用原来的字母后面的第4个字母代替原来的字母。例如,字母“A”后面的第4个字母是“E”,用“E”代替“A”。因此,“China”应译为“Glmre”。编译程序用付赋初值的方法使c1,c2,c3,c4,c5这五个变量的值分别为“C”,“h”,“i”,“n”,“a”,经过运算,使c1,c2,c3,c4,c5分别变成“G”,“l”,“m”,“r”,“e”。分别用put