• 第八章 操作位和位串(四)


    第八章 操作位和位串(四)

    操作以整数形式实现的位串

    设置位

    要创建一个存储为整数的新位串,请对每个位求和 2 的幂:

    set bitint = (2**2) + (2**5) + (2**10)
     
    write bitint
    1060
    
    • 1
    • 2
    • 3
    • 4

    要将现有位串中的位设置为 1,请使用 $zboolean 函数(逻辑 OR)的选项7 (arg1 ! arg2)

    set bitint = $zboolean(bitint, 2**4, 7)
    
    write bitint
    1076
    
    • 1
    • 2
    • 3
    • 4

    要将现有位串中的位设置为 0,请使用 $zboolean 函数的选项 2 (arg1 & ~arg2)

    
    set bitint = $zboolean(bitint, 2**4, 2)
    
    write bitint
    1060
    
    • 1
    • 2
    • 3
    • 4
    • 5

    要在现有位串中切换位,请使用 $zboolean 函数(逻辑 XOR)的选项 6 (arg1 ^ arg2)

    set bitint = $zboolean(bitint, 2**4, 6)
    
    write bitint
    1076
    set bitint = $zboolean(bitint, 2**4, 6)
    
    write bitint
    1060
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    测试位是否已设置

    要将位字符串显示为整数,可以使用如下方法,该方法循环位并使用 $zboolean 函数:

    Class Util.BitUtil Extends %RegisteredObject
    {
    
    /// w ##class(Util.BitUtil).LogicalToDisplay(1)
    ClassMethod LogicalToDisplay(bitint As %Integer)
    {
    	s str = ""
    	for i = 0 : 1 { 
    		q:((2 ** i) > bitint)
    		if $zboolean(bitint, 2 ** i, 1) {
    			s str = str _ 1
    		} else {
    			s str = str _ 0
    		}
    	}
    	q str
    }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    DHC-APP>w ##class(Util.BitUtil).LogicalToDisplay(101000)
    00010001010100011
    
    • 1
    • 2

    查找设置位

    此方法使用$Zlog函数将位字符串中的哪些位设置为整数,该函数返回以10为底的对数值。该方法删除越来越小的位串块,直到没有剩余:

    /// w ##class(Util.BitUtil).FindSetBits(2)
    ClassMethod FindSetBits(bitint As %Integer)
    {
    	s bits = "" 
    	while (bitint '= 0) { 
    		s bit = $zlog(bitint) \ $zlog(2)
    		s bits = bit _ " " _ bits
    		s bitint = bitint - (2 ** bit) 
    	} 
    	q bits
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    DHC-APP>w ##class(Util.BitUtil).FindSetBits(3)
    0 1
    
    • 1
    • 2

    执行按位算术

    使用 $zboolean 函数对存储为整数的位串执行按位逻辑运算。

    对于此示例,假设有两个位串 ab,存储为整数,以及一个 LogicalToDisplay() 方法,如 Display Bits 中定义的,用于显示这些位。

    do ##class(User.BitInt).LogicalToDisplay(a)
    100110111
    do ##class(User.BitInt).LogicalToDisplay(b)
    001000101
    
    • 1
    • 2
    • 3
    • 4

    使用 $zboolean 函数的选项 7 对位执行逻辑 OR

    set c = $zboolean(a, b, 7)
    
    do ##class(User.BitInt).LogicalToDisplay(c)
    101110111
    
    • 1
    • 2
    • 3
    • 4

    使用 $zboolean 函数的选项 1 对位执行逻辑与:

    set d = $zboolean(a, b, 1)
    
    do ##class(User.BitInt).LogicalToDisplay(d)
    000000101
    
    • 1
    • 2
    • 3
    • 4

    转换为常规位串

    要将存储为整数的位串转换为常规位串,请使用 $factor 函数。对于此示例,假设有一个位串为整数的 bitint 和一个 FindSetBits() 方法,如 Find Set Bits 中所定义,以显示设置了哪些位。

    do ##class(User.BitInt).FindSetBits(bitint)
    2 5 10
    set bitstring = $factor(bitint)
    
    zwrite bitstring 
    bitstring=$zwc(128,4)_$c(36,4,0,0)/*$bit(3,6,11)*/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    请注意,常规位串中的位似乎向右移动了一位,因为位串没有位 0。位串中的第一位是位 1

  • 相关阅读:
    数据结构 | 栈的实现
    数据统计与可视化课程总结
    Node.js精进(8)——错误处理
    【C语言】动态内存管理
    浏览器是怎么执行JS的?——消息队列与事件循环
    解决风控模型的过拟合与算法高效求解,来试试这种经典解决方法
    时间轴、流程类时间轴绘制
    多模态大一统:开启全模态LLM和通用AI时代的大门
    【计算机组成原理】第六章 总线系统
    广义表的存储结构及其基本运算
  • 原文地址:https://blog.csdn.net/yaoxin521123/article/details/125439279