文章目录
第五章 Caché 函数大全 $BITLOGIC 函数 - 大纲
-
- 参数
- 描述
-
- 位串优化
- 位串逻辑运算符
- 长度参数
- 示例
对位字符串执行按位运算。
大纲$BITLOGIC(bitstring_expression,length)
参数
- bitstring_expression 由一个或多个位串变量和逻辑运算符&,|,^和〜组成的逻辑表达式。可以将位串指定为局部变量,专用于进程的全局变量,全局变量,对象属性或常量“”。空字符串(“”)的位串长度为0。不能使用返回位串的函数(例如$FACTOR)指定位串。
- length 可选-生成的位串的长度(以位为单位)。如果未指定length,则默认为bitstring_expression中最长的字符串的长度。
$BITLOGIC对由bitstring_expression指定的一个或多个位串值进行按位运算,然后返回结果位串。
位串是一种编码(压缩)的字符串,被解释为一系列位。仅应将使用$BIT,$FACTOR或$BITLOGIC创建的位串或空字符串(“”)提供给$BITLOGIC函数。通常,位串用于索引操作。
$BITLOGIC与任何旧版$ZBIT位串函数都不兼容,并且不应与它们结合使用。 $BITLOGIC和$ZBOOLEAN使用不同的数据格式。一个的结果不能用作另一个的输入。
位串优化
最基本的$BITLOGIC操作是$BITLOGIC(a)。看来,此操作不执行任何操作:输入了位串a,并输出了相同的位串a。但是,$BITLOGIC执行位串压缩,它可以通过从几种压缩算法中进行选择来进行优化。因此,如果位串a自创建以来已发生重大变化,则将其传递给$BITLOGIC可能会导致位串的重新优化。
例如,在大量删除操作之后,索引位串可能已经变成完全或主要由零组成的稀疏位串。通过$BITLOGIC传递此索引位字符串可能会显著提高性能。
位串逻辑运算符
$BITLOGIC只能计算下表中列出的位串运算符:
操作符 | 含义 |
---|---|
& | AND |
OR | |
^ | XOR |
~ | NOT |
bitstring_expression可以包含一个位串(〜A),两个位串(A&B)或两个以上的位串(A&B | C),最多当前31个位串。计算从左到右执行。遵循标准CachéObjectScript操作顺序,可以在bitstring_expression中用括号将逻辑操作分组。如果$BITLOGIC中使用的变量未定义,则将其视为空字符串(“”)。
$BITLOGIC将空字符串视为不确定长度的位串,其中所有位均设置为0。
注意:当向$BITLOGIC提供两个以上的位串操作数时,它必须创建位串临时对象来保存中间结果。在某些极端情况下(许多位串和/或非常大的位串),它可能会耗尽分配来容纳此类临时对象的空间。位串对操作没有此限制,因此对于大型位串操作是更可取的。
NOT(〜)运算符可以用作一元运算符(例如〜A),也可以与其他运算符结合使用(例如A&〜B)。它对字符串执行一个补码运算,将所有1变为0,将所有0变为1。可以使用多个NOT运算符(例如~~~ A)。
长度参数
如果未指定length,则默认为bitstring_expression中最长的字符串的长度。
如果指定了length,它将指定结果位串的逻辑长度。
- 如果长度大于位串表达式中的一个或多个位串,则在执行位串逻辑运算之前,将这些位串填充为该长度的零。
- 如果长度小于位串表达式中的一个或多个位串,则在执行位串逻辑运算之前,这些位串将被截断为该长度。
- 如果length为0,则返回长度为0的位串(空字符串)。
下面的示例创建一些简单的位串,并演示在其上使用$BITLOGIC:
/// d ##class(PHA.TEST.Function).BITLOGIC() ClassMethod BITLOGIC() { // Set a to [1,1] SET $BIT(a,1) = 1 SET $BIT(a,2) = 1 // Set b to [0,1] SET $BIT(b,1) = 0 SET $BIT(b,2) = 1 WRITE !,"bitstring a=",$BIT(a,1),$BIT(a,2) WRITE !,"bitstring b=",$BIT(b,1),$BIT(b,2) SET c = $BITLOGIC(~b) WRITE !,"The one's complement of b=",$BIT(c,1),$BIT(c,2) // 求a和b的(AND) SET c = $BITLOGIC(a&b) // c should be [0,1] WRITE !,"The AND of a and b=",$BIT(c,1),$BIT(c,2) SET c = $BITLOGIC(a&~b) // c should be [1,0] WRITE !,"The AND of a and ~b=",$BIT(c,1),$BIT(c,2) // 找到a和b的并集(OR) SET c = $BITLOGIC(a|b) // c should be [1,1] WRITE !,"The OR of a and b=",$BIT(c,1),$BIT(c,2) SET c = $BITLOGIC(a^b) // c should be [1,0] WRITE !,"The XOR of a and b=",$BIT(c,1),$BIT(c,2) QUIT }
DHC-APP>d ##class(PHA.TEST.Function).BITLOGIC() bitstring a=11 bitstring b=01 The one's complement of b=10 The AND of a and b=01 The AND of a and ~b=10 The OR of a and b=11 The XOR of a and b=10
以下示例显示了指定长度大于输入位串的结果。在执行逻辑运算之前,字符串将被填充为零。
/// d ##class(PHA.TEST.Function).BITLOGIC1() ClassMethod BITLOGIC1() { // Set a to [1,1] SET $BIT(a,1) = 1 SET $BIT(a,2) = 1 WRITE !,"bitstring a=",$BIT(a,1),$BIT(a,2) SET c = $BITLOGIC(~a,7) WRITE !,"~a (length 7)=" WRITE $BIT(c,1),$BIT(c,2),$BIT(c,3),$BIT(c,4) WRITE $BIT(c,5),$BIT(c,6),$BIT(c,7),$BIT(c,8) }
DHC-APP>d ##class(PHA.TEST.Function).BITLOGIC1() bitstring a=11 ~a (length 7)=00111110
此处的补数(〜)为11,即0011111。在执行〜操作之前,位3至7设置为零。此示例还显示第八位,该位超出了指定的字符串长度,因此不受$BITLOGIC操作的影响。当然,它显示为0。
以下示例显示指定长度小于输入位字符串的结果。在执行逻辑操作之前,将位串截断为指定的长度。所有超出指定长度的位默认为0。
/// d ##class(PHA.TEST.Function).BITLOGIC2() ClassMethod BITLOGIC2() { // Set a to [1,1,1] SET $BIT(a,1) = 1 SET $BIT(a,2) = 1 SET $BIT(a,3) = 1 WRITE !,"bitstring a=",$BIT(a,1),$BIT(a,2),$BIT(a,3) SET c = $BITLOGIC(a,2) WRITE !," a (length 2)=" WRITE $BIT(c,1),$BIT(c,2),$BIT(c,3),$BIT(c,4) SET c = $BITLOGIC(~a,2) WRITE !,"~a (length 2)=" WRITE $BIT(c,1),$BIT(c,2),$BIT(c,3),$BIT(c,4) }
DHC-APP>d ##class(PHA.TEST.Function).BITLOGIC2() bitstring a=111 a (length 2)=1100 ~a (length 2)=0000
以下示例显示,如果未指定length,则默认为最长位串的长度。在执行逻辑操作之前,较短的位串将被填充为零。
/// d ##class(PHA.TEST.Function).BITLOGIC3() ClassMethod BITLOGIC3() { // Set a to [1,1,1] SET $BIT(a,1) = 1 SET $BIT(a,2) = 1 SET $BIT(a,3) = 1 // Set b to [1,1] SET $BIT(b,1) = 1 SET $BIT(b,2) = 1 SET c = $BITLOGIC(a&~b) WRITE !," a&~b=" WRITE $BIT(c,1),$BIT(c,2),$BIT(c,3) SET c = $BITLOGIC(a&~b,3) WRITE !,"a&~b,3=" WRITE $BIT(c,1),$BIT(c,2),$BIT(c,3) }
DHC-APP> d ##class(PHA.TEST.Function).BITLOGIC3() a&~b=001 a&~b,3=001
在这里,两个$BITLOGIC操作(带有和不带有长度参数)都返回相同的值:001。