c - 以下C运算符如何组合
问题描述
对于 EFR32FG14P231F256M32,我有以下 C 运算符组合。描述如下所示。我无法将描述与代码匹配。
->
是一个指针。我们两边都有指路?|
是按位或.DOUT
我认为意味着DOUT
从以下P[gpioPortC]
单元格中取出成员,
但正在升级| (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;
解决方案
<< 运算符的意思是“左移位”,它的工作原理如下:
a << b
将a , b位中的位向左移动。要直接回答您的问题, 1 << 5 将 0x01 中的位向左移动 5 次,得到 0x20,即十进制的 32。这具有将数字乘以 2 n 次的效果(在您的情况下 n = 5)。结果值与 DOUT 中的值进行或运算,然后存储在 DOUT 本身中。
编辑:回答评论中添加的问题 OP -
代码中的分配发生的情况与此类似:x = x + 5
.
运算符是的->
简写(*obj).field
。代码中的第一行指示以下内容:
- 取其中的值
GPIO->P[gpioPortC].DOUT
并将其与0x10
. - 将结果分配给
GPIO->P[gpioPortC].DOUT
。
第二行执行非常相似的操作,只是不是执行按位 OR 并将其存储在同一字段中,而是执行按位与某个预定义值的否定形式的字段,然后执行按位 OR 的结果使用另一个预定义的值,然后将其存储在该字段中。
重要的是要理解,简单地在对象上使用->
运算符除了允许您访问存储在该对象中的字段(它们本身可能是指向内存中其他位置的指针或原始变量)之外,什么也做不了。
推荐阅读
- c# - 选择坐标后战舰网格更改c#
- java - Java 正则表达式匹配堆栈溢出
- c# - c#combobox selectedIndex在使用datacontext由xml文件填充时不起作用
- gatsby - Gatsby-Contentful 网站:本地环境没有引入 Contentful 更新?
- shell - 无法从 json 键值响应中解析键值
- python - 如何模拟 ManyToMany 字段?
- php - 查询问题以获取每天重复一次以上的每周数据?
- css - 我的 Rails 6 背景图片没有出现在 Heroku 上
- feature-extraction - 我被困在试图根据标准获取以前的值
- java - 如何从 httpPost 返回一个 Viewable 对象