理解 c 定义宏?

make sense of a c define macro?

我是 c 语言开发的新手。 我试图理解与 MIDI 应用程序相关的代码片段:

#define GETCMD(p) ((p.data.midi.h& 0x70)>>4)
#define GETCH(p) ((p.data.midi.h& 0x0F)+1)

我推测以上是2个宏。 不太清楚的是十六进制值 0x70 和 0x0F。 根据我的理解,第一行是 h 指针右移 4?

以下内容意义不大

#define SETCMD_CH(p, c1, c2) p.data.midi.h=0x80|(c2-1)|((c1&7)<<4)

任何人都可以让我理解这 3 个定义吗?

提前致谢

GETCMD 提取 3 个命令位(从位 4..6)和 returns 它们作为 0..7.

范围内的值

GETCH returns 4 个通道位(从位 0..3 开始)和 returns 它们作为 1..16.

范围内的值

SETCMD_CH设置上面的命令和通道位,即上面两个宏组合的逆运算。

此按位运算只是 p.data.midi.h 中 get/set 相应位所需的移位和掩码。如果您不清楚位运算的工作原理,您可能想阅读一下。

看看"p.data.midi.h"

的结构

你有哪种数据类型,尤其是.h?

我认为这是你拥有的数据 *.data.midi.h 和 0x70 (DEC = 112; BIN = 0111 0000) 之间的按位运算,然后如你所料右移 4。

假设您在 *.data.midi.h 数据中有二进制 0101 0000 中的值,在 GETCMD 之后您将有 101.

通过这种方式,您发现了数据中哪些位的值为 1。 (2 字节)

GETCH 正在处理第一个半字节 (0x0F = Bin 0000 1111),然后出于某种我不知道的原因加 1。

SETCMD_CH 接缝设置 *.data.midi.h 的一些位,您可以在 c1、c2 参数中传递这些位。 *.data.midi.h =0x80|(c2-1)|((c1&7)<<4) *.data.midi.h = 1000 0000 | (c2-1) | ((c1 & 0000 0111) << 4)

对于 c1,我很确定您可以设置 "commands" 之一。

我想你必须用二进制来思考这种情况才能解决和理解。

很抱歉我对您问题的解决方案可能会让您更加困惑:)。