C 您如何理解下面的逐位操作?

C 您如何理解下面的逐位操作?,c,C,我正在写一个c程序,里面有位屏蔽。下面的宏定义了什么?? 所有这些操作都是做什么的 1. #define SINE_PHASEREG_BASE (0x3 << 14) 2. #define IOPORT_MODE_MUX_MASK (0x7 << 0) /*!< MUX bits mask */ 3. #define IOPORT_MODE_MUX_D ( 3 << 0) /*!< MUX function D */ 这些是执行位移位操

我正在写一个c程序,里面有位屏蔽。下面的宏定义了什么?? 所有这些操作都是做什么的

1. #define SINE_PHASEREG_BASE (0x3 << 14) 
2. #define IOPORT_MODE_MUX_MASK (0x7 << 0) /*!< MUX bits mask */
3. #define IOPORT_MODE_MUX_D    (  3 << 0) /*!< MUX function D */

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

一些C基础知识:

宏与函数类似,但不是调用函数,而是 C预处理器将调用宏的文本替换为 宏本身。 例如,我可以创建一个简单的C宏,将1添加到一个数字中,如下所示:

#define ADD_ONE(x) ((x)+1)
int I = ADD_ONE(5);
然后我可以计算一个数加一的值,如下所示:

#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宏,它们在编译代码之前替换调用它们的文本。有时这是很棒的,有时它做了你意想不到的事情。如果您坚持基本原则,它们可能非常有用,但专家可以让代码与这些东西共舞

数字由二进制数表示,并带有最右边的位 如果 位为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

什么是移位操作? 这是计算机如何左右移动位的问题。从数字上讲,向左移位等于乘以2,而向右移位等于整数除以2

运算符将位右移。|运算符是位OR运算符,&是位and运算符。有关按位运算符的详细介绍,请参阅本手册


所以,如果x是5,那么x没有嵌入C语言。你可以使用普通的C教科书。代码可能会调用未定义的行为来移动有符号整数。一般情况下:切勿移位有符号整数,请使用无符号类型。最好使用固定宽度类型。