首页 > 解决方案 > 以下C运算符如何组合

问题描述

对于 EFR32FG14P231F256M32,我有以下 C 运算符组合。描述如下所示。我无法将描述与代码匹配。

但正在升级| (1 << 5); 我有问题理解。

单行这样的 C 运算符组合的逻辑含义是什么?

以下代码将端口 C 的引脚 5 配置为带上拉和滤波器的数字输入。GPIO_PC_MODEL 寄存器中的 MODE5 位域必须设置为 0b0011,并且 GPIO_PC_DOUT 寄存器中的对应位也必须设置为 1 以确定拉动方向。可以使用 emlib 中可用的函数或通过直接寄存器写入来配置引脚:

GPIO->P[gpioPortC ].DOUT = GPIO->P[gpioPortC ].DOUT | (1 << 5); //Input enabled with pull up and filter
GPIO->P[gpioPortC ].MODEL = (GPIO->P[gpioPortC ].MODEL & ~_GPIO_P_MODEL_MODE5_MASK) |
GPIO_P_MODEL_MODE5_INPUTPULLFILTER;

标签: cembeddedoperators

解决方案


<< 运算符的意思是“左移位”,它的工作原理如下:

a << b

a , b位中的位向左移动。要直接回答您的问题, 1 << 5 将 0x01 中的位向左移动 5 次,得到 0x20,即十进制的 32。这具有将数字乘以 2 n 次的效果(在您的情况下 n = 5)。结果值与 DOUT 中的值进行或运算,然后存储在 DOUT 本身中。

编辑:回答评论中添加的问题 OP -

代码中的分配发生的情况与此类似:x = x + 5.

运算符是的->简写(*obj).field。代码中的第一行指示以下内容:

  1. 取其中的值GPIO->P[gpioPortC].DOUT并将其与0x10.
  2. 将结果分配给GPIO->P[gpioPortC].DOUT

第二行执行非常相似的操作,只是不是执行按位 OR 并将其存储在同一字段中,而是执行按位与某个预定义值的否定形式的字段,然后执行按位 OR 的结果使用另一个预定义的值,然后将其存储在该字段中。

重要的是要理解,简单地在对象上使用->运算符除了允许您访问存储在该对象中的字段(它们本身可能是指向内存中其他位置的指针或原始变量)之外,什么也做不了。


推荐阅读