【问题标题】:Bitwise manipulation on GPIO with some masks使用一些掩码对 GPIO 进行按位操作
【发布时间】:2015-12-21 03:32:34
【问题描述】:

我想对 GPIO 结果做一些按位操作,假设我有三个变量来定义某些 GPIO 设备的状态是打开还是关闭:

mask          : 1 means bit is set, and need to be calculate
value         : real gpio value 0 / 1
active_level; : 1 means high active, 0 means low active

假设我有:

mask  : 0010 0001
value : 0000 0001
active: 0000 0001

有什么好的方法(此时我正在考虑循环)根据活动级别获得结果吗?上述情况,bit0为高电平,bit5为低电平,由于bit0为高,bit5为低,所以结果为:

result: 0010 0001 

稍后,我要做的是检查result == mask是否,如果是则表示GPIO设备状态为on(例如两个按钮同时按下)

谢谢

【问题讨论】:

    标签: c++ bit-manipulation gpio


    【解决方案1】:

    您可以考虑以下位操作。

    将value 转换为“1 表示激活”格式

    value_in_activeness = value ^ (~active);
    

    此操作将格式从“1 为高,0 为低”变为“1 有效,0 无效”。

    active 表示“哪些位高电平有效,哪些位低电平有效”。方便的是,它的补码~active 表示“我想转换哪些位以及我想保留哪些位”。 XOR 操作^ 进行实际转换。

    在您的示例中,value_in_activeness 将变为 1111 1111。不过不用担心,因为我们还有下一步。

    掩盖“我不在乎”的部分

    bits_I_care = value_in_activeness & mask;
    

    使用& 进行位掩码太基础了,我不知道该怎么解释。

    在您的示例中,结果是0010 0001。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-07
      • 2018-11-07
      相关资源
      最近更新 更多