理解c定义宏?

时间:2016-02-22 10:10:46

标签: c macros bitwise-operators

我是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)

可以请任何人让我理解这三个定义吗?

提前致谢

2 个答案:

答案 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我很确定你可以设置一个“命令”。

我认为在这种情况下你必须用二进制思考来解决和理解。

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