我是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)
可以请任何人让我理解这三个定义吗?
提前致谢
答案 0 :(得分:4)
GETCMD
提取3个命令位(来自位4..6)并将它们返回为0..7范围内的值。
GETCH
返回4个通道位(来自位0..3)并将它们返回为1..16范围内的值。
SETCMD_CH
设置上面的命令和通道位,即它只是上述两个宏组合的反向操作。
这种按位操作只是在p.data.midi.h
内获取/设置适当位所需的移位和掩码。如果您不清楚这些是如何工作的,那么您可能希望阅读按位操作。
答案 1 :(得分:1)
看一下“p.data.midi.h”
的结构您拥有哪种数据类型,尤其是.h?
我认为这是你有* .data.midi.h和0x70(DEC = 112; BIN = 0111 0000)的数据之间的按位操作,然后你猜的是右移4。
假设您在* .data.midi.h数据中包含GETCMD之后的二进制0101 0000中的值,您将拥有101.
通过这种方式,您可以发现数据中哪些位值为1。 (2蚕)
GETCH正在制作第一个半字节(0x0F = Bin 0000 1111),然后由于某些我不知道的原因加1。
SETCMD_CH接缝设置* .data.midi.h的一些位,你可以在c1,c2参数中传递。 * .data.midi.h = 0x80 |(c2-1)|((c1&amp; 7)&lt;&lt; 4) * .data.midi.h = 1000 0000 | (c2-1)| ((c1&amp; 0000 0111)&lt;&lt; 4)
使用c1我很确定你可以设置一个“命令”。
我认为在这种情况下你必须用二进制思考来解决和理解。
很抱歉我的问题解决方案可能会让你更加困惑:)。