开发者

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

目录
  • 交换奇偶位
  • offsetof 宏
  • 总结

交换奇偶位

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

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

示例 1:

输入:10

输出:5

解释:10的二进制补码为00000000000000000000000000001010,交换奇偶位后为0NIvXLL0000000000000000000000000000101,该二进制补码为5的二进制补码,故输出为5

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

奇数位上都为 1 的数字

01010101010101010101010101010101

0x55555555

偶数位上都为 1 的数字

10101010101010101010101010101010

0xaaaaaaaa

#include <stdio.h>
#define 开发者_PythonSWAP(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;
}

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

offsetof 宏

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

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

示例 1:

输入:

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

输出:

offsetof(struct S, a) = 0

offsetof(struct S, b) = 0

offsetof(struct S, c) = 0

offsehttp://www.devze.comtof(struct S, d) = 0

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

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

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

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

成员变量的地址

&( ( (struct_name*)0 )->mem_name)

#include <stdio.h>
#define OFFSETOF(st编程客栈ruct_napythonme, 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;
}

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

总结

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

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

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新开发

开发排行榜