文章目录

  • 第五章 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。