我需要编写一个函数,它将一个整数作为参数,它表示一个真值表中的一行,以及一个布尔数组,它存储真值表中该行的值。
这是一个示例真值表
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|
我不能为我的生活找出如何做到这一点,并且无法在网络上的其他地方找到解决方案。抱歉所有的困惑和感谢您的帮助
答案 0 :(得分:1)
好了,你现在重写了你的问题要更清楚了。首先,getRow
需要额外的参数:位数。具有2位的行1产生与具有64位的行1不同的结果,因此我们需要一种方法来区分它。其次,通常使用C ++,一切都是零indxed,所以我将你的真值表向下移动一行,以便行“0”返回所有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);
}
}