跳转到内容

软件工程师手册/语言词典/PLI/位串

来自维基教科书,开放的书籍,开放的世界

注意:本文需要了解 PL/I 的基本知识,可以在 软件工程师手册/语言词典/PLI 中找到。

位串“作为字符串”

[编辑 | 编辑源代码]

在 PL/I 中,位串形式上被声明为“1 位字母”的字符串,也就是说,所有内置字符串函数都可以用于它,

dcl   my_chars   char (8) varying   init ( 'ABCDCD' );
dcl   my_bits    bit  (8) varying   init ( '01010'B );
   put skip list ( length ( my_chars ) );   /* output is 6, the current length of the varying string */
   put skip list ( length ( my_bits  ) );   /* output is 5, the current length of the varying string */
   put skip list ( index ( my_chars , 'CD'  ) );   /* output is 3, the first position of substring 'CD'  */
   put skip list ( index ( my_bits  , '10'B ) );   /* output is 2, the first position of substring '10'B */

位串作为布尔值

[编辑 | 编辑源代码]

位串的常见用法是将它们用作位向量,尤其是位 (1) 串表示单个布尔值

  • '1'B 被解释为真
  • '0'B 被解释为假

位 (1) 串可以在条件语句和循环语句中用作布尔表达式。

dcl   one_bit   bit (1);
   one_bit = ( 1 < 2 );   /* now one_bit has the value '1'B */
   one_bit = ( 2 < 1 );   /* now one_bit has the value '0'B */
   if one_bit then
      put skip list ( 'value of one_bit is true' );
   else
      put skip list ( 'value of one_bit is false' );
   do while ( one_bit );
      .....
   end;

在期望位 (1) 值的表达式中使用的位串被解释为 '1'B = 真,当且仅当至少一位的值为 '1'B。

dcl   many_bits   bit (99);
   if many_bits then
      put skip list ( 'at least one of the bits has value 1'B' );
   else
      put skip list ( 'none of the bits has value 1'B' );
   do while ( many_bits );   /* do while at least one bit is set */
      .....
   end;

基本布尔运算符

[编辑 | 编辑源代码]

布尔运算符可用于计算新的位 (1) 值

  • 前缀运算符 ¬ 用作逻辑非。
  • 中缀运算符 & 用作逻辑与。
  • 中缀运算符 | 用作逻辑或。
dcl   bit_a    bit (1);
dcl   bit_b    bit (1);
dcl   result   bit (1);
   result = ¬ bit_a;           /* result = '1'B if and only if bit_a is '0'B */
   result =   bit_a & bit_b;   /* result = '1'B if and only if both bit_a and bit_b are '1'B */
   result =   bit_a | bit_b;   /* result = '0'B if and only if both bit_a and bit_b are '0'B */

注意:使用编译时选项,非运算符和或运算符可以用其他符号替换,
为了与现有的 PL/I 程序兼容,通常 ^ 用作非,! 用作或。
注意:在Enterprise PL/I for z/OS 中,¬ 也可以用作中缀运算符,A ¬ B 表示 A XOR B(异或)。

布尔运算符也可以用于位 (n) 串,其中 n > 1,
在这种情况下,计算是以逐位方式进行的,即

  • ( A & B ) 的第 1 位 = ( A 的第 1 位 ) & ( B 的第 1 位 )
  • ( A & B ) 的第 2 位 = ( A 的第 2 位 ) & ( B 的第 2 位 )
  • 等等...

如果 A 和 B 的长度不同,则较短的那个会在右侧用 '0'B 填充。

dcl   bit_a   bit (3)   init ( '101'B  );
dcl   bit_b   bit (4)   init ( '1100'B  );
   put skip list ( ¬ bit_a );         /* '010'B  */
   put skip list ( ¬ bit_b );         /* '0011'B */
   put skip list ( bit_a & bit_b );   /* '1000'B */
   put skip list ( bit_a | bit_b );   /* '1110'B */

内置函数 BOOL

[编辑 | 编辑源代码]

所有 16 种可能的二进制布尔运算都可以通过 BOOL 函数完成。

BOOL ( A , B , pattern_4 )

其中 A 和 B 是位串,pattern_4 是位 (4) 串。

让我们首先假设 A 和 B 都是位 (1),那么 pattern_4 的函数是

  • pattern_4 的第 1 位定义了 bool 的结果,如果 A = '0'B 且 B = '0'B
  • pattern_4 的第 2 位定义了 bool 的结果,如果 A = '0'B 且 B = '1'B
  • pattern_4 的第 3 位定义了 bool 的结果,如果 A = '1'B 且 B = '0'B
  • pattern_4 的第 4 位定义了 bool 的结果,如果 A = '1'B 且 B = '1'B

如果 A 或 B 是位 (n),其中 n > 1,那么计算是以逐位方式进行的,如上所述。

pattern_4 的一些可能值

                           alternative      meaning
bool ( A , B , '0001'B )       A  &  B      A AND  B    logical AND
bool ( A , B , '0111'B )       A  |  B      A OR   B    logical OR
bool ( A , B , '0110'B )       A ¬=  B      A XOR  B    exclusive-OR
bool ( A , B , '1110'B )   ¬ ( A  &  B )    A NAND B    NOT AND
bool ( A , B , '1000'B )   ¬ ( A  |  B )    A NOR  B    NOT OR
bool ( A , B , '1001'B )       A  =  B      A IFF  B    equivalence
bool ( A , B , '1101'B )      ¬A  |  B      A  ->  B    implication: if A then B
bool ( A , B , '1011'B )       A  | ¬B      a  <-  B    implication: if B then A

数组操作

[编辑 | 编辑源代码]

内置函数 ALL 和 ANY 期望数组作为参数。

让我们首先假设参数 ARRAY 是一个位 (1) 数组,那么

  • ALL 返回 '1'B = 真,当且仅当 ARRAY 的所有元素都是 '1'B。
  • ANY 返回 '1'B = 真,当且仅当 ARRAY 中至少有 1 个元素是 '1'B。

如果参数 ARRAY 是一个位 (n) 数组,其中 n > 1,那么计算是以逐位方式进行的,如上所述。

dcl   array (3)     bit (8)   init ( '11110000'B ,
                                     '11001100'B ,
                                     '10101010'B   );
dcl   number (42)   bin fixed (15);
   put skip list ( ALL ( array ) );   /* output is '10000000'B */
   put skip list ( ANY ( array ) );   /* output is '11111110'B */
   if ANY ( number < 0 ) then         /* expression "number < 0" returns an array of 42 bit (1) strings */
      put skip list ( 'at least 1 number is negative' );
华夏公益教科书