使用非常数变量检索单行真值 table
Retrieving a single row of a truth table with a non-constant number of variables
我需要编写一个函数,它接受一个整数作为参数,它代表真值中的一行 table,以及一个布尔数组,它存储该真值行的值 table.
这是一个真实的例子table
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 |
请注意,给定的事实 table 可能比此 table 有更多或更少的行,因为可能的变量数量会发生变化。
函数原型可能如下所示
getRow(int rowNum, bool boolArr[]);
如果这个函数被调用,例如,as
getRow(3, boolArr[])
需要return一个包含以下元素的数组
|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|
我一辈子都弄不明白该怎么做,也无法在网络上的其他地方找到解决方案。对于所有的困惑,我们深表歉意,感谢您的帮助
好的,现在您重写了您的问题,使其更加清晰。首先,getRow
需要一个额外的参数:位数。 2 位的第 1 行产生的结果与 64 位的第 1 行产生的结果不同,因此我们需要一种方法来区分它。其次,通常使用 C++,所有内容都是零索引的,所以我将把你的真相 table 向下移动一行,以便行“0”returns 全部 true
s.
这里的关键是要意识到二进制的行号已经是你想要的了。以这一行为例(将 4 向下移动到 3):
3 | T | F | F |
3
在二进制中是 011
,倒过来是 {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);
}
}
我需要编写一个函数,它接受一个整数作为参数,它代表真值中的一行 table,以及一个布尔数组,它存储该真值行的值 table.
这是一个真实的例子table
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 |
请注意,给定的事实 table 可能比此 table 有更多或更少的行,因为可能的变量数量会发生变化。
函数原型可能如下所示
getRow(int rowNum, bool boolArr[]);
如果这个函数被调用,例如,as
getRow(3, boolArr[])
需要return一个包含以下元素的数组
|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|
我一辈子都弄不明白该怎么做,也无法在网络上的其他地方找到解决方案。对于所有的困惑,我们深表歉意,感谢您的帮助
好的,现在您重写了您的问题,使其更加清晰。首先,getRow
需要一个额外的参数:位数。 2 位的第 1 行产生的结果与 64 位的第 1 行产生的结果不同,因此我们需要一种方法来区分它。其次,通常使用 C++,所有内容都是零索引的,所以我将把你的真相 table 向下移动一行,以便行“0”returns 全部 true
s.
这里的关键是要意识到二进制的行号已经是你想要的了。以这一行为例(将 4 向下移动到 3):
3 | T | F | F |
3
在二进制中是 011
,倒过来是 {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);
}
}