【发布时间】:2018-02-17 23:41:09
【问题描述】:
假设我有一个由{0₁, ¯1₂, 0₂, 1₂, ¯2₃, ¯1₃, 0₃, 1₃, 2₃, ¯3₄, ¯2₄, ¯1₄, 0₄, 1₄, 2₄, 3₄} 组成的集合S。我想在S上定义以下操作:
-
S < 0当且仅当S为负时才返回一个。 -
¯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的 carry,它为零。 -
S ¢ 1返回S + 1的进位,当且仅当S + 1 = 0ₙ对应于n > 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 │
└───┴───┴───┴───┴───┴───┴───┘
我想要做的是将这个多值真值表转换为布尔真值表,以便我可以使用按位运算符实现并行化操作。听起来很简单。将0000 分配给0₁,将0001 分配给¯1₂,...,1111 分配给3₄。求解得到的 Karnaugh map 以得到 CNF 或 DNF 表达式并收工。
不幸的是,对于 S 到布尔值的这种幼稚映射,生成的 CNF 或 DNF 表达式可能效率不高。我想找到将这个多值真值表表示为布尔真值表的最有效方法。在这里,高效意味着使用最少的运算符来实现各种运算,优先考虑加法、求反、进位和比较。然而,问题在于有16! 或20922789888000 方法将S 映射到布尔值。有没有比暴力破解更好的方法?
【问题讨论】:
-
不应该把
1和0加到左边栏吗? -
我不明白你的意思。
-
我的意思是
1和0也应该是逻辑值。1₂ + 0是1₂,但1 + 0是什么?顺便说一句,是否允许移位运算符? -
它们属于不同的集合。
1₂属于集合S而1和0属于集合B的布尔值。+操作要求其左操作数属于集合S,其右操作数属于集合B。+操作的结果是来自集合S的值。 -
没有。不允许使用位移运算符,因为每个位都将单独存储。这样做的原因是为了并行。例如,给定
S值的矩阵,所有高位都存储在一个位数组中,所有低位都存储在另一个位数组中,等等。因此,位移运算符将在矩阵的值之间移动位。这个想法是使用按位运算来执行卷积。
标签: logic boolean-logic karnaugh-map