第五章 Caché 函数大全 $BITLOGIC 函数

2020-08-26  本文已影响0人  Cache技术分享

第五章 Caché 函数大全 $BITLOGIC 函数

对位字符串执行按位运算。

大纲

$BITLOGIC(bitstring_expression,length)

参数

描述

$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,它将指定结果位串的逻辑长度。

示例

下面的示例创建一些简单的位串,并演示在其上使用$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。

上一篇下一篇

猜你喜欢

热点阅读