检索具有非常量变量数的真值表的单行
Retrieving a single row of a truth table with a non-constant number of variables
我需要编写一个函数,该函数将整数(表示真值表中的一行)和一个布尔数组(用于存储真值表中该行的值)作为参数。
下面是一个示例真值表
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|
我一辈子都无法弄清楚如何做到这一点,也无法在网络上的其他地方找到解决方案。很抱歉所有的困惑,感谢您的帮助
好的,
现在你重写了你的问题,使其更清晰。首先,getRow
需要采取一个额外的参数:位数。具有 2 位的第 1 行与具有 64 位的第 1 行产生不同的结果,因此我们需要一种方法来区分它。其次,通常对于 C++,一切都是零 indxed,所以我将把你的真值表下移一行,以便行"0"返回所有true
。
这里的关键是要意识到二进制中的行号已经是您想要的。以这一行为例(已将 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);
}
}
相关文章:
- 用真值填充矢量
- 布尔真值表 C++
- 查找下一个具有真值C++的数组索引
- 如何从文件显示布尔值表
- 为什么 cal 函数总是返回真值
- 检查网格/真值表的对称性
- 从STL矢量的真值中随机选择索引
- 将真值赋给浮点值
- 读取真值表C++的逻辑运算符表达式
- 检索具有非常量变量数的真值表的单行
- 我的代码中的错误 - 布尔真值表
- 实现真值表的一般模式
- 真值表到按位表达式
- C++建议在用作真值的赋值周围加上括号
- 如何生成一个在真值之后退出的循环
- 二元变量的置换及其值表
- 当观察到的表达式变为真值时中断
- c++中vptr和虚值表的概念
- 简单继承获得虚值表错误
- 如果用户使用了我希望他们使用的值表之外的值,我如何提示他们重新输入?