检索具有非常数变量的真值表的单行

时间:2015-01-21 03:54:52

标签: c++ arrays logic truthtable

我需要编写一个函数,它将一个整数作为参数,它表示一个真值表中的一行,以及一个布尔数组,它存储真值表中该行的值。

这是一个示例真值表

Row| A | B | C |
 1 | T | T | T |
 2 | T | T | F |
 3 | T | F | T |
 4 | T | F | F |
 5 | F | T | T |
 6 | F | T | F |
 7 | F | F | T |
 8 | F | F | F |

请注意,给定的真值表可能比此表具有更多或更少的行,因为可能的变量数量可能会发生变化。

函数原型可能看起来像这样

getRow(int rowNum, bool boolArr[]);

如果调用此函数,例如,

getRow(3, boolArr[])

需要返回一个包含以下元素的数组

|1|0|1|    (or |T|F|T|)  

我遇到的困难是因为变量的数量可以改变,因此增加或减少行数。例如,变量列表可以是A,B,C,D,E和F,而不仅仅是A,B和C.

我认为最好的解决方案是编写一个计算到行号的循环,并且基本上改变了数组的元素,就像它在二进制中计算一样。那么

1st loop iteration, array elements are 0|0|...|0|1|
2nd loop iteration, array elements are 0|0|...|1|0|

我不能为我的生活找出如何做到这一点,并且无法在网络上的其他地方找到解决方案。抱歉所有的困惑和感谢您的帮助

1 个答案:

答案 0 :(得分:1)

好了,你现在重写了你的问题要更清楚了。首先,getRow需要额外的参数:位数。具有2位的行1产生与具有64位的行1不同的结果,因此我们需要一种方法来区分它。其次,通常使用C ++,一切都是零indxed,所以我将你的真值表向下移动一行,以便行“0”返回所有true s。

这里的关键是要意识到二进制中的行号已经是你想要的了。取这一行(将4比3调低):

3 | T | F | F |
二进制文件中的

3011,反转为{true, false, false} - 正是您想要的。我们可以使用按位或数组表示:

{!(3 | 0x4), !(3 | 0x2), !(3 | 0x1)}

所以这只是把它写成循环的问题:

void getRow(int rowNum, bool* arr, int nbits)
{
    int mask = 1 << (nbits - 1);
    for (int i = 0; i < nbits; ++i, mask >>= 1) {
        arr[i] = !(rowNum & mask);
    }
}