理解 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" 之一。
我想你必须用二进制来思考这种情况才能解决和理解。
很抱歉我对您问题的解决方案可能会让您更加困惑:)。
我是 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" 之一。
我想你必须用二进制来思考这种情况才能解决和理解。
很抱歉我对您问题的解决方案可能会让您更加困惑:)。