按位表达的真值表

时间:2016-02-29 12:45:28

标签: c++ c bitwise-operators

给定一个包含输入位和输出位的真值表,很容易找到将输入位组合成单个输出位的布尔表达式。

我的问题是,派生的布尔表达式分别对每个位进行操作。

我正在寻找相同的程序,但使用编程语言中使用的按位运算符,它们并行运行所有输入位,以并行导出输出位。

示例问题:

  • 输入:8位整数,其中只有一些输入位是相关的,比如第2位和第2位。 5.其他人的状况与产出无关。
  • 输出:8位整数,具有两个相关的输出位,取决于两个相关输入位的状态,比如位3和3。 6.所有其他位应均匀设置为1或0.

有办法:

  1. 使用对输入整数进行操作的按位运算导出公式/算法,以复制"部分真值表"?
  2. 最小化派生公式/算法的复杂性?

2 个答案:

答案 0 :(得分:1)

好吧,我会做这样的事情:

首先定义一些位掩码:

#define BITMASK0 (1<<0)
#define BITMASK1 (1<<1)
#define BITMASK2 (1<<2)
#define BITMASK3 (1<<3)
#define BITMASK4 (1<<4)

然后,我将定义如何隔离输入位:

#define INBIT0(x) (BITMASK0&(x))>>0
#define INBIT1(x) (BITMASK1&(x))>>1
#define INBIT2(x) (BITMASK2&(x))>>2
#define INBIT3(x) (BITMASK3&(x))>>3
#define INBIT4(x) (BITMASK4&(x))>>4

以及如何将输出位置于正确的输出位置

#define OUTBIT0(x) ((x)<<0) & BITMASK0
#define OUTBIT1(x) ((x)<<1) & BITMASK1
#define OUTBIT2(x) ((x)<<2) & BITMASK2
#define OUTBIT3(x) ((x)<<3) & BITMASK3
#define OUTBIT4(x) ((x)<<4) & BITMASK4

现在,在代码中,我会根据你的逻辑

描述如何操纵它
int main()
{
    unsigned char a; // choose your initialization here
    unsigned char b = 0;

    b = OUTBIT0(1) | OUTBIT1(INBIT5(a) & INBIT3(a)) | OUTBIT2(0);
}

答案 1 :(得分:0)

这实际上取决于你想要实现的目标和方式。

  1. 使用对输入整数进行操作的按位运算来导出公式/算法,以复制“部分真值表”?
  2. 解决问题的方法非常简单且不理想:Canonical Normal Form。基本上它是每个True或False输出的基本运算符(和,或者)的组合。为什么不是最理想的?因为如果您有4个输入位和1个输出位且50%的输出为True,则结果表达式将包含大约43个运算符。如果你不打算进行极端的操作,那么实际上,任何现代CPU都可以每秒执行数百万个这样的表达式。如果任何一个输出的比率明显偏斜,这可能非常有效。

    1. 最小化派生公式/算法的复杂性?
    2. 这是非常重要的部分,并且有某些方法。它被称为circuit minimization。如果您只是需要优化的功能,可以使用Karnaugh map,它可以被人类使用。如果您需要自动化,请查看Quine–McCluskey algorithmEspresso

      编辑:有一点需要注意,不能保证您的功能实际上可以简化为紧凑的表达式。