利用宏定义解决问题

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

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

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

运行结果:



目录
相关文章
|
9月前
|
程序员 编译器 C++
【实用编程技巧】不想改bug?初学者必须学会使用的报错函数assert!(断言函数详解)
【实用编程技巧】不想改bug?初学者必须学会使用的报错函数assert!(断言函数详解)
73 2
|
5月前
|
API Windows
MASM32编程完善SysInfo遇到奇怪故障,真切感受全局变量和局部变量之别……
MASM32编程完善SysInfo遇到奇怪故障,真切感受全局变量和局部变量之别……
|
安全 C语言
C语言编程陷阱:库函数陷阱
会造成较高的系统负担 暂存然后以大块写入的方式 缓冲数组最好时成为静态数组,或者显示内存申请
70 1
|
9月前
|
监控 Java Unix
日常知识点之内存泄露定位手段(c语言hook malloc相关方式)
日常知识点之内存泄露定位手段(c语言hook malloc相关方式)
186 0
|
存储 编译器 C语言
【C语言】汇编角度剖析函数调用的整个过程
【C语言】汇编角度剖析函数调用的整个过程
基于C语言的简单问题分析解决
基于C语言的简单问题分析解决
基于C语言的简单问题分析解决
|
NoSQL C语言
C语言开发过程中段错误处理方法之经典
C语言开发过程中段错误处理方法之经典
206 0
C语言开发过程中段错误处理方法之经典
|
测试技术 C语言
C语言设计堆栈测试用例
C语言设计堆栈测试用例
|
机器学习/深度学习 存储 自然语言处理
C语言编译器概要设计思路一
C语言编译器概要设计思路一
292 0
C语言编译器概要设计思路一
看看有哪些你遗漏的c语言细节!!(c语言阶段性小结)
看看有哪些你遗漏的c语言细节!!(c语言阶段性小结)