美文网首页
第五章 Caché 函数大全 $BITLOGIC 函数

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

作者: Cache技术分享 | 来源:发表于2020-08-26 09:29 被阅读0次

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

    相关文章

      网友评论

          本文标题:第五章 Caché 函数大全 $BITLOGIC 函数

          本文链接:https://www.haomeiwen.com/subject/nhhxsktx.html