【问题标题】:Sequence of boolean operations with the following truth table具有以下真值表的布尔运算序列
【发布时间】:2015-07-14 23:47:58
【问题描述】:

具有以下真值表的布尔运算序列是什么:

mask | target | result
======================
  0  |   0    |   0
  0  |   1    |   0
  1  |   0    |   1
  1  |   1    |   0

简而言之,就是“掩码位为真时切换,掩码位为假时清除”。


现在一些上下文:

我正在使用 Arduino 设计转向信号,并且我正在使用位掩码设置当前闪烁的灯,仅使用两个位:

typedef enum ACTIVE_LIGHTS {
    NONE        = 0,  // 00
    RIGHT_LIGHT = 1,  // 01
    LEFT_LIGHT  = 2,  // 10
    BOTH        = 3   // 11
};

现在有一个要求是:当我运行 toggleLeft() 方法时,我想清除右侧位,并切换左侧位。

我尝试了两种方法,但都没有按预期工作(遮罩总是 RIGHT_LIGHT 或 LEFT_LIGHT):

target ^= mask; //this toggles one side but doesn't turn the other off
target = mask;  //this turns other side off, but never turns off same side

【问题讨论】:

    标签: language-agnostic bit-manipulation bitwise-operators boolean-logic bitmask


    【解决方案1】:

    用 0 与灯关闭(X1 AND 10 = X0)和用 1 进行 XOR 灯切换(0X XOR 10 = 1X)怎么样?

    编辑:最终答案

    看起来只有当掩码位为 1 且输入位为 0 时才输出 1,因此对于每个位,函数类似于 out = mask AND NOT in。

    【讨论】:

    • 是的,我知道我可以分解操作,但是一个聪明的班轮总是值得努力的:)
    • 这是真的!想出一种简短而聪明的做事方式总是令人满足的。我会继续思考;在手机上制作卡诺图很难!
    • 看起来只有当掩码位为 1 且输入位为 0 时才输出 1,因此对于每个位,函数类似于 out = mask AND NOT in。这有帮助吗?
    • 我编辑了问题以包含一个视觉真值表。仍在此处进行测试。
    • 得到它的工作与你的小费!我使用的最后一个表达式是:_sides_to_turn = lightSide & ~_sides_to_turn; 之前遇到了麻烦,因为我是 C++ 新手,使用 foo & !barfoo && !bar 没有成功 - 当然,它们是合乎逻辑的,而不是按位运算符...请编辑您的答案,以便我可以接受!非常感谢你! :D
    猜你喜欢
    • 1970-01-01
    • 2012-09-27
    • 2016-09-28
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    相关资源
    最近更新 更多