如果我在 Pascal 中有一组布尔变量,我如何测试其中的恰好一个是
True
?
在 Pascal 中你可以这样做:
if Integer(a) + Integer(b) + Integer(c) = Integer(true) then
writeln("exactly one is true");
与
Integer(true)
进行比较很重要,因为在不同版本的 Pascal 中它可能是不同的值。
condition0
condition0 <> condition1
[condition0, condition1] >< [false, condition2] = [true]
对于四个布尔值,您可以编写:
[condition0, condition1] >< [condition2, condition3] = [true]
对称差分运算符 ><
由 Extended Pascal(ISO 标准 10206)定义,在您的 Pascal 实现中可能不可用。Boolean
是枚举数据类型。
根据定义,它相当于
type
Boolean = (false, true);
因此, false
的序数值为 0
, true
的序数值为 1
。
您可以利用这一事实,正如Matt 已经建议的那样,检查总和是否等于 1:
ord(condition0) + ord(condition1) + ord(condition2) = 1
condition0
...conditionN
视为“二进制数”的数字
4 * ord(condition2) + 2 * ord(condition1) + 1 * ord(condition0)
并检查结果是否为 an integer
2 的幂。
这使您不仅可以知道那个恰好满足了一个条件,还可以知道是哪个并采取相应的行动。
case ord(condition0) + 2 * (ord(condition1) + 2 * ord(condition2)) of
1:
begin
{ condition0 is true }
end;
2, 4:
begin
{ condition1 or condition2 is true }
end;
otherwise
begin
{ multiple conditions are true, or none at all }
end
end
var
onlyOneTrue: array[Boolean, Boolean, Boolean] of Boolean
{ This is an Extended Pascal initial state specification: }
value [otherwise [otherwise [otherwise false]]];
begin
onlyOneTrue[true, false, false] ≔ true;
onlyOneTrue[false, true, false] ≔ true;
onlyOneTrue[false, false, true] ≔ true;
{ And then you can query the LUT for the result: }
if onlyOneTrue[condition0, condition1, condition2] then
如果在某个时刻,集合中的布尔变量数量少于 LUT 的维数,请在适当的位置插入文字值 false
。set
结合使用,因为这样只需检查集合的基数。
type
condition = (condition0, condition1, condition2);
var
conditions: set of condition value [];
begin
{ After some program logic determined `condition0` is `true`: }
conditions ≔ conditions + [condition0];
{ After some program logic determined `condition1` is `false`: }
conditions ≔ conditions − [condition1];
{ Check the number of members present in `conditions`. }
if card(conditions) = 1 then
内置函数 card
由 Extended Pascal 定义,可能在您的 Pascal 实现中不可用或以不同方式调用(例如 popcnt
之类的函数)。