3

我定义了许多标志(由我无法控制的头文件),看起来像这样:

  *
  * OPTVAL field for IPV6_ADDR_PREFERENCES_FLAGS
  *
   01 IPV6-ADDR-PREFERENCES-FLAGS PIC X(4).
  *
  * IPV6_ADDR_PREFERENCES_FLAGS mappings
  *
   77 IPV6-PREFER-SRC-HOME        PIC X(4) VALUE X'00000001'.      
   77 IPV6-PREFER-SRC-COA         PIC X(4) VALUE X'00000002'.      
   77 IPV6-PREFER-SRC-TMP         PIC X(4) VALUE X'00000004'.      
   77 IPV6-PREFER-SRC-PUBLIC      PIC X(4) VALUE X'00000008'.      
   77 IPV6-PREFER-SRC-CGA         PIC X(4) VALUE X'00000010'.
   77 IPV6-PREFER-SRC-NONCGA      PIC X(4) VALUE X'00000020'.

我需要对其中一些标志执行二进制 OR,我想知道是否有一种我不知道的简单方法可以做到这一点。是否有一个简单的关键字或语法会导致我的程序将这些标志视为二进制值并让我进行数学运算,或者这个头文件完全被破坏了?

4

3 回答 3

3

我会认为这个库写得不好。如果您要编写一个供 COBOL 使用的低级库,您应该选择更易于 COBOL 操作的数据类型。在这种情况下,表示长字 (S9(9) COMP) 的 COMP 项对于 COBOL 来说会更容易处理。

假设您将这些值组合在一起以调用较低级别的库,您可以将它们加在一起以获得标志值。这是有效的,因为每个常量都有一个位集。

您可以将常量移动到临时重新定义区域,或者利用 COBOL 缺乏类型安全性并将它们传递给子程序进行操作。以下将适用于 VMS COBOL:

IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLEOR.
DATA DIVISION.
WORKING-STORAGE SECTION.
*
* OPTVAL field for IPV6_ADDR_PREFERENCES_FLAGS
*
 01 IPV6-ADDR-PREFERENCES-FLAGS PIC X(4).
*
* IPV6_ADDR_PREFERENCES_FLAGS mappings
* 
 77 IPV6-PREFER-SRC-HOME        PIC X(4) VALUE X'00000001'.      
 77 IPV6-PREFER-SRC-COA         PIC X(4) VALUE X'00000002'.      
 77 IPV6-PREFER-SRC-TMP         PIC X(4) VALUE X'00000004'.      
 77 IPV6-PREFER-SRC-PUBLIC      PIC X(4) VALUE X'00000008'.      
 77 IPV6-PREFER-SRC-CGA         PIC X(4) VALUE X'00000010'.
 77 IPV6-PREFER-SRC-NONCGA      PIC X(4) VALUE X'00000020'.

PROCEDURE DIVISION.
1.
    CALL "BINARYOR" 
        USING IPV6-PREFER-SRC-HOME
              IPV6-PREFER-SRC-COA    
              IPV6-ADDR-PREFERENCES-FLAGS.
    CALL "BINARYOR" 
        USING IPV6-PREFER-SRC-PUBLIC
              IPV6-ADDR-PREFERENCES-FLAGS
              IPV6-ADDR-PREFERENCES-FLAGS.

    IF IPV6-ADDR-PREFERENCES-FLAGS NOT = X'0000000B'
        DISPLAY "Failure"
    END-IF.

END PROGRAM SAMPLEOR.

IDENTIFICATION DIVISION.
PROGRAM-ID. BINARYOR.

DATA DIVISION.
WORKING-STORAGE SECTION.

LINKAGE SECTION.
 01     ARG1        PIC S9(9) COMP.
 01     ARG2        PIC S9(9) COMP.
 01     RESULT      PIC S9(9) COMP.

PROCEDURE DIVISION USING ARG1 ARG2 RESULT.
1. 
    ADD ARG1 TO ARG2 GIVING RESULT.
END PROGRAM BINARYOR. 

如果这不起作用,那么您将需要研究您的 COBOL 平台对二进制项的表示以找出正确的类型。

我在 COBOL 中(几十年前)做了很多(可能太多了)较低级别的事情。通常,你可以解决它。但在某些时候它变得太难了,不值得麻烦。在这一点上,调用一种更适合旋转位的语言(如 C)是值得的。

于 2009-06-27T14:45:52.617 回答
0

可以使用 COMP 执行二进制操作。COBOL 中的 COMP 字段应该保存二进制值。当我们使用二进制 COMP 字段进行计算或执行操作时,在 COBOL 中是最可取的。作为二进制格式的 COMP 可以保存半字或全字(即 2 个字节或 4 个字节的长度)。这与在 H 或 F 中定义变量的汇编程序非常相似,后者代表半字或全字,转换为 2 字节或 4 字节。因此,当执行数学运算时,最好使用 COMP,然后再转到字母数字字段。

于 2009-07-09T06:06:40.930 回答
0

您可以使用四个 PIC 1(8) 二进制字段(假设为 32 位字操作)并将 IPV6 项移动到它们,然后通过选择单个位进行二进制 OR 使用 PIC 1 进行操作发生 8 次(如果可用)。

于 2010-12-16T16:36:11.920 回答