1

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

这是一个示例真值表

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|

我一生都无法弄清楚如何做到这一点,也无法在网络上的其他地方找到解决方案。抱歉所有的困惑,感谢您的帮助

4

1 回答 1

1

好的,现在您重写了您的问题,使其更加清晰。首先,getRow需要带一个额外的参数:位数。具有 2 位的第 1 行产生的结果与具有 64 位的第 1 行产生的结果不同,因此我们需要一种方法来区分它。其次,通常使用 C++,一切都是零索引,所以我将把你的真值表向下移动一行,这样行“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);
    }
}
于 2015-01-21T04:01:47.750 回答