我正在编写一个带有位掩码的c程序。下面的宏定义了什么? 所有这些操作<<,>>,|和&做??
bar
答案 0 :(得分:1)
这些是C位宏,它们执行移位操作。 数字和硬件寄存器由最低级别的位表示。
一些C基础知识:
例如,我可以创建一个简单的C宏,将1加到数字上,如下所示:
#define ADD_ONE(x) ((x)+1)
然后我可以计算出一个数字加一个的值,如下所示:
int I = ADD_ONE(5);
这将由CPP预处理器替换为:
int I = ((5)+1);
然后,编译器将其编译为以下内容:
int I = 6;
请注意,对ADD_ONE
的此“调用”是在编译时完成的,而不是在运行时完成的,因为ADD_ONE是宏而不是函数。
第1到3行是C宏,它们在编译代码之前替换了调用它们的文本。有时这很棒,有时却可以完成您意想不到的事情。如果您坚持这些基础知识,它们可能会非常有用,但是专家可以使这些事情与代码融为一体。
为什么用复杂的方式表达零或一?因为,其他位使用类似的公式。位1代表零或两个:b1 *(2 ^ 1)。
通常,n位代表bn *(2 ^ n)。
因此,如果将int x设置为5,则: X = 5 = 4 + 1 = 1 * 2 ^ 2 + 0 * 2 ^ 1 + 1 * 2 ^ 0 = 101二进制。
这是计算机向左或向右移位位的方式。从数值上讲,向左移位与乘以2相同,向右移位是2除以整数。
运算符<<
左移位,>>
右移位。 |
是按位“或”运算符,&
是按位“与”运算符。有关按位运算符的详细介绍,请参考此出色的answer。
因此,如果x为5,则x << 1为1010b,等于= 8 + 0 + 2 + 0 =10。与x * 2相同。
您为什么要关心?
因为这些宏正在执行移位操作!因此,您需要了解数字如何用二进制表示才能理解。
让我们看看这些宏的作用!
SINE_CONTREG_BASE (0x1 << 13)
这将取一个数字并将其左移13次,因此使用此宏时,它将被CPP替换为文本(0x1 << 13)
,并编译为常数值8196(即2 ^ 0) * 2 ^ 13)。因此,该宏是一种证明SINE_CON寄存器的第14位足够重要的方法,足以拥有一个定义该位的值的宏。
SINE_PHASEREG_BASE (0x3 << 14)
类似地,它用于表示SINE_PHASE寄存器中的两位二进制位字段,可以在位15和14中找到(注意3为11b)。
IOPORT_MODE_MUX_MASK
这就是说IOPORT_MODE_MUX
寄存器是该寄存器中的前三位,而MASK则是一个值,该值可通过对值的按位与运算来用于对这三个位进行加法运算。寄存器。要设置这些值,可以使用按位或运算来设置该寄存器中的硬件位。
IOPORT_MODE_MUX_D
IOPORT_MODE_MUX
函数的D位是同一寄存器中的前两位。您可以使用此宏相应地提取或设置这两位。