利用宏定义解决问题

简介: 利用宏定义解决问题

一、计算结构体成员变量的偏移地址

1、思路分析

对于这个题目,首先用#define定义的宏应该要包含两个参数,一个是结构体变量,另一个是该结构体的成员,因为计算的是偏移量,要用变量的地址减去结构体变量的首地址,那么我们可以假设结构体变量的初始地址为0。

2、代码实现

#include<stdio.h>
#define OFFSET(S,name) (int)(&(((struct S*)0)->name))
struct S
{
  char name[10];
  int age;
  double score;
 };
int main()
{
  int n = OFFSET(S, age);
  printf("%d\n", n);
  return 0;
}

运行结果:

二、将一个整数的二进制位的奇数位和偶数位交换

1、思路分析

将一个二进制数进行代码交换,可以将二进制数的奇数位右移,偶数位左移,然后进行相加就可以实现该功能,那么怎么得到奇数位或者偶数位呢?

想要得到奇数位,可以对原来的数字与10101010(以8位为例)

那么得到偶数位,就对原来的数字与01010101(以8位为例)

然后在对偶数位左移,奇数位右移再相加就可以得到了。

2、代码实现

#include<stdio.h>
#define SWAP(n) ((n&(0x55555555))<<1|(n&(0xaaaaaaaa))>>1)
int main()
{
  printf("%d\n", SWAP(4));
  return 0;
}

运行结果:



目录
相关文章
|
8月前
|
编译器
【Bug】8086汇编学习
随笔 与汇编的灵活与底层所伴随的,是使用者极大的心智负担。 模块之间的隔离性很难控制。甚至多个子程序间的标号也不能相同,故子程序无法独立开发后直接集成。
166 5
|
NoSQL C语言
C语言开发过程中段错误处理方法之经典
C语言开发过程中段错误处理方法之经典
193 0
C语言开发过程中段错误处理方法之经典
看看有哪些你遗漏的c语言细节!!(c语言阶段性小结)
看看有哪些你遗漏的c语言细节!!(c语言阶段性小结)