第九十八章 Caché 函数大全 $ZBOOLEAN 函数

第九十八章 Caché 函数大全 $ZBOOLEAN 函数

按位逻辑运算功能。

大纲

$ZBOOLEAN(arg1,arg2,bit_op)
$ZB(arg1,arg2,bit_op)

参数

  • arg1 第一个论点。整数或字符串,或者解析为整数或字符串的变量或表达式。所有字符必须具有介于0到255之间的ASCII值。不能为浮点数。
  • arg2 第二个论点。整数或字符串,或者解析为整数或字符串的变量或表达式。所有字符必须具有介于0到255之间的ASCII值。不能为浮点数。
  • bit_op 指示要执行的操作的整数(请参阅下表。)允许的值为0到15(含)。

描述

$ZBOOLEAN对两个参数arg1和arg2执行bit_op指定的按位逻辑运算。 $ZBOOLEAN返回由bit_op值指定的arg1和arg2的按位组合的结果。可以使用ZZDUMP命令查看结果。

$ZBOOLEAN对字符串或数字执行其操作。对于字符串,它对字符串中的每个字符执行逻辑AND和OR运算。对于数字,它对整个数字作为一个单元执行逻辑“与”和“或”运算。要强制将数字字符串评估为数字,请在字符串前加上加号(+)。

注意:$ZBOOLEAN不支持值大于ASCII 255的Unicode字符。要将$ZBOOLEAN应用于16位Unicode字符串,必须首先使用$ZWUNPACK,然后使用$ZBOOLEAN,再使用$ZWPACK

$ZBOOLEAN$BITLOGIC使用不同的数据格式。一个的结果不能用作另一个的输入。

按位运算包括arg1和arg2的16种可能的布尔组合。下表列出了这些组合。

bit_op中的位掩码已执行操作
00
1arg1 & arg2 (logical AND)
2arg1 & ~arg2
3arg1
4~arg1 & arg2
5arg2
6arg1 ^ arg2 (logical XOR (exclusive or))
7arg1 ! arg2 (logical OR (inclusive or))
8~(arg1 ! arg2)
9~(arg1 ^ arg2)
10~arg2 (logical NOT)
11arg1 ! ~arg2
12~arg1 (logical NOT)
13~arg1 ! arg2
14~(arg1 & arg2)
15-1 (one’s complement of 0)

其中:

  • &是逻辑AND
  • !是逻辑或
  • 〜是逻辑非
  • ^是异或

所有$ZBOOLEAN操作都解析arg1和arg2,包括bit_op值0、3、5、10、12和15。

$ZBOOLEAN arg1和arg2参数可以解析为以下类型之一:

  • 一个整数。正整数或负整数(最多18个数字)。除数字0–9以及可选的一个或多个前导加号和减号之外,不允许使用其他字符。前导零被忽略。
  • 一个字符串。用引号引起来,允许包含任何内容的任何长度的字符串。注意,字符串“123”和整数123不同。允许使用空字符串,但是如果arg2是空字符串,则$ZBOOLEAN始终返回arg1的值,而不管bit_op值如何。
  • 带符号的字符串。前面有加号或减号的字符串将被解析为整数,而与字符串的内容无关。有符号字符串的长度限制与整数相同。有符号空字符串等效于零。

强烈建议arg1和arg2都解析为整数或都解析为字符串。通常,arg1和arg2应该是相同的数据类型。在大多数情况下,在$ZBOOLEAN操作中组合整数和字符串不会产生有用的结果。

参数

arg1

按位逻辑表达式中的第一个参数。对于字符串,返回值的长度始终与此参数的长度相同。

arg2

按位逻辑表达式中的第二个参数。

bit_op

要执行的按位逻辑运算,指定为0到15(包括0和15)之间的数字代码。因为此代码被当作位掩码处理,所以值为16 = 0、17 = 1、18 = 2,等等。

bit_op值0和15返回一个常数,但是它们也对参数进行求值。如果arg1是整数(或带符号的字符串),则bit_op 0返回0,而bit_op 15返回–1(0的补码)。如果arg1是字符串,则bit_op 0为其中的每个字符返回低值(十六进制00)。 arg1,并且bit_op 15为arg1中的每个字符返回一个高值(十六进制FF)。如果arg2是空字符串(“”),则两个操作均返回arg1的文字值。

bit_op值3、5、10和12仅对一个自变量执行逻辑运算,但它们对两个自变量求值。

  • 无论arg2的值如何,bit_op = 3始终返回arg1的值。
  • 当两个参数的数据类型相同时,bit_op = 5返回arg2的值。但是,如果一个参数是一个字符串,而另一个参数是一个整数(或带符号的字符串),则结果是不可预测的。如果arg2为空字符串,则$ZBOOLEAN始终返回arg1的文字值。
  • 如果两个参数都是整数,则bit_op=10返回arg2的补值。如果arg1是一个字符串,则该操作将为arg1中的每个字符返回一个高位字符。如果arg2是字符串,arg1是整数,则对arg2字符串执行按位操作。如果arg2为空字符串,$ZBOOLEAN总是返回arg1的文字值。
  • 对于除空字符串以外的任何arg2值,bit_op=12都会返回arg1的补值(如果它是整数(或有符号字符串))。如果arg1是一个字符串,则该操作返回arg1中每个字符的补码(十六进制值)。如果arg2为空字符串,$ZBOOLEAN总是返回arg1的文字值。

示例

对于除空字符串以外的任何arg2值,bit_op=12都会返回arg1的补值(如果它是整数(或有符号字符串))。如果arg1是一个字符串,则该操作返回arg1中每个字符的补码(十六进制值)。如果arg2为空字符串,$ZBOOLEAN总是返回arg1的文字值。

DHC-APP>WRITE $ZBOOLEAN("abcd","_",1)
ABCD

小写字母“a” = [01100001](ASCII十进制97)

64+32+1=97

下划线字符“_” = [01011111](ASCII十进制95)

64+16+8+4+2+1=95

大写字母“A” = [01000001](ASCII十进制65)

64+1=65

DHC-APP>WRITE $ZBOOLEAN("abcdefghijklmnopqrstuvwxyz","_",1)
ABCDEFGHIJKLMNOPQRSTUVWXYZ

下面的示例执行与上一个示例相同的AND操作,但是使用参数的ASCII十进制值。函数$ASCII(“a”)返回第一个参数的十进制值97:

DHC-APP>WRITE $ZBOOLEAN($ASCII("a"),95,1)
65

下面的示例使用$CHAR值作为第二个参数执行相同的AND操作:

DHC-APP>WRITE $ZBOOLEAN("a",$CHAR(95),1)
A

以下示例说明了逻辑或:

DHC-APP>WRITE $ZBOOLEAN(1,0,7)
1
DHC-APP>WRITE $ZBOOLEAN(1,1,7)
1
DHC-APP>WRITE $ZBOOLEAN(2,1,7)
3
DHC-APP>WRITE $ZBOOLEAN(2,2,7)
2
DHC-APP>WRITE $ZBOOLEAN(3,2,7)
3

以下逻辑或示例演示了字符串比较和数字比较之间的区别:

DHC-APP>WRITE $ZBOOLEAN(64,255,7)
255

将两个值比较为数字并显示255。

DHC-APP>WRITE $ZBOOLEAN("64","255",7)
65

将两个值作为字符串进行比较,并显示65。

DHC-APP>WRITE $ZBOOLEAN(+"64",+"255",7)
255

加号将两个值的比较强制为数字,并显示255。

以下示例说明了异或:

DHC-APP>WRITE $ZBOOLEAN(1,0,6)
1
DHC-APP>WRITE $ZBOOLEAN(1,1,6)
0
DHC-APP>WRITE $ZBOOLEAN(2,1,6)
3
DHC-APP>WRITE $ZBOOLEAN(2,2,6)
0
DHC-APP>WRITE $ZBOOLEAN(3,2,6)
1
DHC-APP>WRITE $ZBOOLEAN(64,255,6)
191

以下示例显示了一个4字节实体,所有字节均设置为1:

DHC-APP>WRITE $ZBOOLEAN(5,1,15)
-1

以下示例将x设置为3个字节,所有位均设置为1:

DHC-APP>SET x=$ZBOOLEAN("abc",0,15)
 
DHC-APP>WRITE !,$LENGTH(x)
3
DHC-APP>WRITE !,$ASCII(x,1)," ",$ASCII(x,2)," ",$ASCII(x,3)
255 255 255

注意

整数处理

$ZBOOLEAN执行按位运算之前,它会根据大小将每个数值解释为8字节或4字节有符号二进制值。 $ZBOOLEAN始终将数字值解释为一系列字节。布尔操作使用这些字节作为字符串参数。结果类型与arg1的类型相同。

如果arg1或arg2是数字,并且不能表示为8字节有符号整数(大于18个十进制数字),则会出现<Function>错误。如果arg1和arg2都是数值,并且其中一个需要8个字节来表示,那么这两个值都被解释为8字节的二进制值。

在前面的转换完成之后,将给定的布尔组合逐位应用于arg1和arg2以产生结果。返回的结果总是与arg1相同的长度(在上述数值数据转换之后)。如果arg2的长度小于arg1的长度,则arg2将以从左到右的方式与arg1的连续子字符串重复组合。

$ZBOOLEAN始终以小端顺序将数值解释为一系列字节,低位字节优先,无论计算机的本机字节顺序是什么。

$ZBOOLEAN值的内部结构

下表列出了$ZBOOLEAN的内部规则。不需要了解这些规则就可以使用$ZBOOLEAN;它们在这里仅供参考。

从arg1和arg2中比较的任意两个位有四种可能的状态。当且仅当bit_op具有表中所示的位掩码时,布尔运算才会生成TRUE结果(=1)。

Bit in arg1Bit in arg2Bit_op十进制中的位掩码Bit_op二进制格式的位掩码
0081000
0140100
1020010
1110001

EQV和IMP逻辑运算符

$ZBOOLEAN间接支持EQV和IMP逻辑运算符。这些逻辑运算符的定义如下:

  • EQV是两个表达式之间的逻辑等价性。它由$ZBOOLEAN(arg1,arg2,9)表示。这在逻辑上是(arg1^arg2),在逻辑上与((arg1)&(~arg2))相同!(arg1和arg2)。
  • IMP是两个表达式之间的逻辑含义。它由$ZBOOLEAN(arg1,arg2,13)表示。这在逻辑上是(〜arg1)! arg2。)。
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页