您如何理解以下一些明智的操作?

时间:2018-08-16 21:52:28

标签: c

我正在编写一个带有位掩码的c程序。下面的宏定义了什么? 所有这些操作<<,>>,|和&做??

bar

1 个答案:

答案 0 :(得分:1)

这些是C位宏,它们执行移位操作。 数字和硬件寄存器由最低级别的位表示。

一些C基础知识:

  1. 宏类似于函数,但是宏不是调用函数,而是 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. 数字由二进制数表示,最右边的位 (最低有效位,又称为b0)表示值0,如果 位为零,如果为1,则为1,或者b0 *(2 ^ 0)。

为什么用复杂的方式表达零或一?因为,其他位使用类似的公式。位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二进制。

  1. 什么是移位操作?

这是计算机向左或向右移位位的方式。从数值上讲,向左移位与乘以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位是同一寄存器中的前两位。您可以使用此宏相应地提取或设置这两位。