前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >操作以整数形式实现的位串

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

作者头像
用户7741497
发布2022-08-03 09:36:35
发布2022-08-03 09:36:35
45300
代码可运行
举报
文章被收录于专栏:hml_知识记录hml_知识记录
运行总次数:0
代码可运行

设置位

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

代码语言:javascript
代码运行次数:0
复制
set bitint = (2**2) + (2**5) + (2**10)
 
write bitint
1060

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

代码语言:javascript
代码运行次数:0
复制
set bitint = $zboolean(bitint, 2**4, 7)

write bitint
1076

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

代码语言:javascript
代码运行次数:0
复制
set bitint = $zboolean(bitint, 2**4, 2)

write bitint
1060

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

代码语言:javascript
代码运行次数:0
复制
set bitint = $zboolean(bitint, 2**4, 6)

write bitint
1076
set bitint = $zboolean(bitint, 2**4, 6)

write bitint
1060

测试位是否已设置

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

代码语言:javascript
代码运行次数:0
复制
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
}

}
代码语言:javascript
代码运行次数:0
复制
DHC-APP>w ##class(Util.BitUtil).LogicalToDisplay(101000)
00010001010100011

查找设置位

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

代码语言:javascript
代码运行次数:0
复制
/// 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
}
代码语言:javascript
代码运行次数:0
复制
DHC-APP>w ##class(Util.BitUtil).FindSetBits(3)
0 1

执行按位算术

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

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

代码语言:javascript
代码运行次数:0
复制
do ##class(User.BitInt).LogicalToDisplay(a)
100110111
do ##class(User.BitInt).LogicalToDisplay(b)
001000101

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

代码语言:javascript
代码运行次数:0
复制
set c = $zboolean(a, b, 7)

do ##class(User.BitInt).LogicalToDisplay(c)
101110111

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

代码语言:javascript
代码运行次数:0
复制
set d = $zboolean(a, b, 1)

do ##class(User.BitInt).LogicalToDisplay(d)
000000101

转换为常规位串

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

代码语言:javascript
代码运行次数:0
复制
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)*/

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

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 设置位
  • 测试位是否已设置
  • 查找设置位
  • 执行按位算术
  • 转换为常规位串
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档