利用宏定义解决问题

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

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

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

运行结果:



目录
相关文章
|
4月前
|
程序员 编译器 C++
【实用编程技巧】不想改bug?初学者必须学会使用的报错函数assert!(断言函数详解)
【实用编程技巧】不想改bug?初学者必须学会使用的报错函数assert!(断言函数详解)
58 2
|
3月前
|
NoSQL 程序员 Redis
C语言字符串的设计缺陷
C语言字符串的设计缺陷
40 1
|
3月前
|
Unix 编译器 C语言
C语言中的条件编译:探索编译时的决策
C语言中的条件编译:探索编译时的决策
|
4月前
|
程序员 编译器 测试技术
C语言初阶⑨(调试)(如何写出好的代码)(模拟实现strcpy和strlen)
C语言初阶⑨(调试)(如何写出好的代码)(模拟实现strcpy和strlen)
39 1
|
3月前
|
编译器 C语言
C语言环境处理收尾
C语言环境处理收尾
19 0
|
3月前
|
编译器 C语言
C语言收尾 预处理相关知识
C语言收尾 预处理相关知识
28 0
|
4月前
|
存储 自然语言处理 编译器
c语言的程序环境和预处理(一眼丁真)
c语言的程序环境和预处理(一眼丁真)
|
4月前
|
C语言
<C语言错误处理> 非局部跳转<setjmp.h>头文件
<C语言错误处理> 非局部跳转<setjmp.h>头文件
|
存储 编译器 C语言
【C语言】汇编角度剖析函数调用的整个过程
【C语言】汇编角度剖析函数调用的整个过程
|
存储 NoSQL Java
【C语言】关于我回头学的那些错误处理等(六)
我的第一门语言就是C,但是学艺不精,中途跑去学了C#和Java后,感觉到了C的重要性,毕竟是最接近底层的语言,又跑回来学C。 毕竟前两门的控制语句,变量什么的都是类似的,回到C后只需要学习一些特定C的语法,比如宏,预编译指令等等,这些对我来说都是陌生的词汇。 所以边学边记录一下以前的知识。
207 0