旧帕斯卡代码中十六进制数之和的条件

Condition as sum of hexadecimal numbers in old Pascal code

提问人:KarolC 提问时间:10/6/2023 更新时间:10/11/2023 访问量:88

问:

我有一个非常古老的 Pascal 程序。单元顶部是一组常量,如下所示:

feature1 = $01; 
feature2 = $02; 
feature3 = $04;
feature4 = $08; 
feature5 = $10;

在数据库中,有一列表示属性,并且有上述特征组合的总和。我认为它可能非常有用,即使在今天,它也可以让我们避免复杂的问题 条件块,但我想阅读更多关于它的信息,并查看此类代码的更多解释良好的示例。因此,如果您之前看到类似的东西,我将不胜感激地提供指向某些文章和摘录的链接,因为我甚至不知道我必须在 Google 中搜索什么。

十六进制 帕斯卡

评论

4赞 500 - Internal Server Error 10/6/2023
这通常称为位掩码。在二进制中,这些值是 00001、00010、00100、01000、10000,因此您可以使用运算符测试位,例如。.andif Value and feature2 <> 0 then ... (feature bit 2 was set)
3赞 Marco van de Voort 10/6/2023
通常它们被 OR 在一起。是否从零开始并不重要,但如果您想设置 feature3 并且不知道它是否已经设置,这确实很重要。
0赞 tofro 10/15/2023
这实际上并不是最“帕斯卡式”的做事方式:Pascal 有一个特定的语言特性,即做同样的事情(在大多数编译器中,SET 最终成为位域。SET OF

答:

0赞 Scooter 10/11/2023 #1

下面是一个使用 Free Pascal 中的常量的示例

Program HexConstants;

Const
    (* In Pascal a hexadecimal numeric literal is indicated by
       prefixing a numeric literal with a $ *)
    feature1 = $01;
    feature2 = $02;
    feature3 = $04;
    feature4 = $08;
    feature5 = $10;

Var
    features : integer;

procedure PrintFeatureDecimalValues();
begin
    Writeln(' feature1 = ', feature1);
    Writeln(' feature2 = ', feature2);
    Writeln(' feature3 = ', feature3);
    Writeln(' feature4 = ', feature4);
    Writeln(' feature5 = ', feature5);
    Writeln('__________________________________');
end;

procedure ShowFeaturesThatAreSet(features : integer);
begin
    if features = 0 then
        Writeln('No features are set');
    (* bitwise **and** to see if feature<n> bit is set *)
    if features and feature1 <> 0 then
        Writeln('Feature 1 is set');
    if features and feature2 <> 0 then
        Writeln('Feature 2 is set');
    if features and feature3 <> 0 then
        Writeln('Feature 3 is set');
    if features and feature4 <> 0 then
        Writeln('Feature 4 is set');
    if features and feature5 <> 0 then
        Writeln('Feature 5 is set');
    Writeln('__________________________________');
end;

Begin
    PrintFeatureDecimalValues;
    features := feature1 + feature3;
    ShowFeaturesThatAreSet(features);
    features := feature4 + feature5;
    ShowFeaturesThatAreSet(features);
    features := 0;
    ShowFeaturesThatAreSet(features);
    features := feature1 + feature2 + feature3 + feature4 + feature5;
    ShowFeaturesThatAreSet(features);
    (* adding to an already set feature *)
    features := feature2;
    features := features or feature4; (* adding feature4 *)
    ShowFeaturesThatAreSet(features);    
End.

输出:

feature1 = 1
feature2 = 2
feature3 = 4
feature4 = 8
feature5 = 16
__________________________________
Feature 1 is set
Feature 3 is set
__________________________________
Feature 4 is set
Feature 5 is set
__________________________________
No features are set
__________________________________
Feature 1 is set
Feature 2 is set
Feature 3 is set
Feature 4 is set
Feature 5 is set
__________________________________
Feature 2 is set
Feature 4 is set
__________________________________