假设我有一个集合 S
,包含以下元素:{0₁, ¯1₂, 0₂, 1₂, ¯2₃, ¯1₃, 0₃, 1₃, 2₃, ¯3₄, ¯2₄, ¯1₄, 0₄, 1₄, 2₄, 3₄}
。我想对 S
定义以下操作:
S < 0
表示当S
为负数时返回1。¯S
表示S
的否定。S + 0
表示返回S
加零,即S
不变。S + 1
表示返回S
的绝对值加一,模下标。例如:¯1₃ + 1
和1₃ + 1
都被计算为2₃
。¯2₃ + 1
和2₃ + 1
都被计算为0₃
。- 表达式
0₃ + 1
被计算为1₃
。
S ¢ 0
表示返回S + 0
的进位,即零。S ¢ 1
表示返回S + 1 = 0ₙ
(其中n > 1
)的进位,当且仅当S + 1 = 0ₙ
时返回1。
S S<0 ¯S S+0 S+1 S¢0 S¢1
┌───┬───┬───┬───┬───┬───┬───┐
│ 0₁│ 0 │ 0₁│ 0₁│ 0₁│ 0 │ 0 │
├───┼───┼───┼───┼───┼───┼───┤
│¯1₂│ 1 │ 1₂│¯1₂│ 0₂│ 0 │ 1 │
├───┼───┼───┼───┼───┼───┼───┤
│ 0₂│ 0 │ 0₂│ 0₂│ 1₂│ 0 │ 0 │
├───┼───┼───┼───┼───┼───┼───┤
│ 1₂│ 0 │¯1₂│ 1₂│ 0₂│ 0 │ 1 │
├───┼───┼───┼───┼───┼───┼───┤
│¯2₃│ 1 │ 2₃│¯2₃│ 0₃│ 0 │ 1 │
├───┼───┼───┼───┼───┼───┼───┤
│¯1₃│ 1 │ 1₃│¯1₃│ 2₃│ 0 │ 0 │
├───┼───┼───┼───┼───┼───┼───┤
│ 0₃│ 0 │ 0₃│ 0₃│ 1₃│ 0 │ 0 │
├───┼───┼───┼───┼───┼───┼───┤
│ 1₃│ 0 │¯1₃│ 1₃│ 2₃│ 0 │ 0 │
├───┼───┼───┼───┼───┼───┼───┤
│ 2₃│ 0 │¯2₃│ 2₃│ 0₃│ 0 │ 1 │
├───┼───┼───┼───┼───┼───┼───┤
│¯3₄│ 1 │ 3₄│¯3₄│ 0₄│ 0 │ 1 │
├───┼───┼───┼───┼───┼───┼───┤
│¯2₄│ 1 │ 2₄│¯2₄│ 3₄│ 0 │ 0 │
├───┼───┼───┼───┼───┼───┼───┤
│¯1₄│ 1 │ 1₄│¯1₄│ 2₄│ 0 │ 0 │
├───┼───┼───┼───┼───┼───┼───┤
│ 0₄│ 0 │ 0₄│ 0₄│ 1₄│ 0 │ 0 │
├───┼───┼───┼───┼───┼───┼───┤
│ 1₄│ 0 │¯1₄│ 1₄│ 2₄│ 0 │ 0 │
├───┼───┼───┼───┼───┼───┼───┤
│ 2₄│ 0 │¯2₄│ 2₄│ 3₄│ 0 │ 0 │
├───┼───┼───┼───┼───┼───┼───┤
│ 3₄│ 0 │¯3₄│ 3₄│ 0₄│ 0 │ 1 │
└───┴───┴───┴───┴───┴───┴───┘
我想要做的是将这个多值真值表转换成布尔真值表,以便我可以使用位运算符进行并行操作。听起来很简单。将
0₁
赋值为0000
,将¯1₂
赋值为0001
,依此类推,将3₄
赋值为1111
。解决所得到的卡诺图,得到一个合取范式(CNF)或析取范式(DNF)表达式,然后就可以了结了。
不幸的是,使用这种天真的将S
映射到布尔值的方法得到的CNF或DNF表达式可能不够有效。我想找到最有效的方法将多值真值表表示为布尔真值表。在这里,有效意味着使用最少的运算符来实现各种操作,首选加法、否定、进位和比较。然而,问题在于有16!
或20922789888000
种将S
映射到布尔值的方式。有没有比暴力搜索更好的方法来找到解决方案?
1
和0
吗? - Stanislav Kralin1
和0
也应该是逻辑值。1₂ + 0
是1₂
,但是1 + 0
是什么呢?顺便问一下,位移运算符允许使用吗? - Stanislav Kralin1₂
属于集合S
,而1
和0
属于布尔值集合B
。+
操作要求其左操作数属于集合S
,右操作数属于集合B
。+
操作的结果是来自集合S
的一个值。 - Aadit M Shah