第五章 Caché 函数大全 $BITLOGIC 函数
第五章 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。