给定一个包含输入位和输出位的真值表,很容易找到将输入位组合成单个输出位的布尔表达式。
我的问题是,派生的布尔表达式分别对每个位进行操作。
我正在寻找相同的程序,但使用编程语言中使用的按位运算符,它们并行运行所有输入位,以并行导出输出位。
示例问题:
有办法:
答案 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)
这实际上取决于你想要实现的目标和方式。
解决问题的方法非常简单且不理想:Canonical Normal Form。基本上它是每个True或False输出的基本运算符(和,或者)的组合。为什么不是最理想的?因为如果您有4个输入位和1个输出位且50%的输出为True,则结果表达式将包含大约43个运算符。如果你不打算进行极端的操作,那么实际上,任何现代CPU都可以每秒执行数百万个这样的表达式。如果任何一个输出的比率明显偏斜,这可能非常有效。
这是非常重要的部分,并且有某些方法。它被称为circuit minimization。如果您只是需要优化的功能,可以使用Karnaugh map,它可以被人类使用。如果您需要自动化,请查看Quine–McCluskey algorithm或Espresso。
编辑:有一点需要注意,不能保证您的功能实际上可以简化为紧凑的表达式。