C语言交换奇偶位与offsetof宏的实现方法

 更新时间:2023年02月01日 10:55:47   作者:阿亮joy.  
offsetof()是C自带的一个宏,它的作用就是计算结构体成员相对于首地址处的偏移量,下面这篇文章主要给大家介绍了关于C语言交换奇偶位与offsetof宏的实现方法,需要的朋友可以参考下

交换奇偶位

题目内容:写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。

注:二进制补码的最低位为第一位,最高位为第三十二位。

示例 1:
输入:10
输出:5
解释:10的二进制补码为00000000000000000000000000001010,交换奇偶位后为00000000000000000000000000000101,该二进制补码为5的二进制补码,故输出为5

思路:交换奇偶位,其实就当于将偶数位右移了一位,奇数位左移了一位。那现在的问题就转化成了如何得到偶数位和奇数位上的数字。如果想要得到奇数位上的数字,只需要让该数字和奇数位都为 1 的数字按位与,就能得到奇数位上的数字。同理,只需要让该数字和偶数位都为 1 的数字按位与,就能得到偶数位上的数字。得到这两个数字之后,对它们进行相应的移位,就能得到交换奇偶位后的结果了。

奇数位上都为 1 的数字
01010101010101010101010101010101
0x55555555
偶数位上都为 1 的数字
10101010101010101010101010101010
0xaaaaaaaa

#include <stdio.h>
#define SWAP(N) ((N & 0xaaaaaaaa) >> 1) + ((N & 0x55555555) << 1)
int Swap(const int num)
{
	return ((num & 0xaaaaaaaa) >> 1) + ((num & 0x55555555) << 1);
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret1 = Swap(n);
	int ret2 = SWAP(n);
	printf("ret1 = %d\n", ret1);
	printf("ret2 = %d\n", ret1);

	return 0;
}

offsetof 宏

题目内容:写一个宏,计算结构体中某变量相对于首地址的偏移,并给出说明。

示例 1:
输入:

输出:
offsetof(struct S, a) = 0
offsetof(struct S, b) = 0
offsetof(struct S, c) = 0
offsetof(struct S, d) = 0

struct S 的结构体内存对齐示意图

如果对结构体内存对齐这个知识点不熟悉的话。

思路:根据上面的struct S 的结构体内存对齐示意图可以知道,其实偏移量就是相对于起点的位置。所以,我们需要确定一个基准地址(起点)。为了方便,博主将 0 作为基准地址,当然也可以用任意一个数字作为基准地址。确定好基准地址后,我们就需要找到成员变量的地址,那么用成员变量的地址减去基准地址就能够得到结构体中某变量相对于首地址的偏移。

成员变量的地址
&( ( (struct_name*)0 )->mem_name)

#include <stdio.h>
#define OFFSETOF(struct_name, mem_name) (int)&( ( (struct_name*)0 )->mem_name)
struct S
{
	int a;
	short b;
	int c;
	char d;
};

int main()
{
	printf("%d\n", OFFSETOF(struct S, a));
	printf("%d\n", OFFSETOF(struct S, b));
	printf("%d\n", OFFSETOF(struct S, c));
	printf("%d\n", OFFSETOF(struct S, d));

	return 0;
}

总结

本篇文章主要讲解了如何交换二进制补码的奇偶位和模拟实现offsetof宏。其中模拟实现offsetof宏是百度曾经考过的原题,希望大家能过掌握。

到此这篇关于C语言交换奇偶位与offsetof宏实现的文章就介绍到这了,更多相关C语言交换奇偶位与offsetof宏内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 看图深入理解单链表的反转

    看图深入理解单链表的反转

    今天遇到单向链表的反转的问题,于是静下心来好好想了一番。下面这篇文章主要给大家介绍了关于单链表反转的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • C++内存管理面经

    C++内存管理面经

    这篇文章主要介绍了C++的内存分配方式以及介绍了下栈和堆的区别,感兴趣的小伙伴可以参考阅读本文
    2023-03-03
  • 详解C++设计模式编程中策略模式的优缺点及实现

    详解C++设计模式编程中策略模式的优缺点及实现

    这篇文章主要介绍了C++设计模式编程中策略模式的优缺点及实现,文中讨论了策略模式中设计抽象接口的继承和组合之间的区别,需要的朋友可以参考下
    2016-03-03
  • C++使用ImGUI框架开发一个简单程序

    C++使用ImGUI框架开发一个简单程序

    ImGui 是一个用于C++的用户界面库,跨平台、无依赖,支持OpenGL、DirectX等多种渲染API,下面就跟随小编一起学习一下如何使用ImGUI框架开发一个简单程序吧
    2023-08-08
  • C语言利用EasyX实现绘制足球图案

    C语言利用EasyX实现绘制足球图案

    这篇文章主要为大家详细介绍了C语言如何利用EasyX绘图库实现绘制一个简单的足球图案,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-11-11
  • MFC实现学生选课系统

    MFC实现学生选课系统

    这篇文章主要为大家详细介绍了MFC实现学生选课系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • IOS 开发UITextView回收或关闭键盘

    IOS 开发UITextView回收或关闭键盘

    这篇文章主要介绍了IOS 开发UITextView回收或关闭键盘的相关资料,需要的朋友可以参考下
    2017-06-06
  • 详解C++ 模板编程

    详解C++ 模板编程

    模板(template)是C++实现泛型(Generics)和元编程(Meta Programming)的基础。本文抛砖引玉,简要介绍C++模板编程,不足之处敬请指正。
    2020-09-09
  • C++/C 回文字符串的实例详解

    C++/C 回文字符串的实例详解

    这篇文章主要介绍了C++ 回文字符串的实例详解的相关资料,需要的朋友可以参考下
    2017-07-07
  • 详解C++中的指针、数组指针与函数指针

    详解C++中的指针、数组指针与函数指针

    本文从初学者的角度,深入浅出地讲解C++中的指针、数组指针与函数指针,对最常混淆的引用传递、值传递和指针传递做了区处,需要的朋友可以参考下
    2015-07-07

最新评论