美文网首页
第七章 操作位和位串(三)

第七章 操作位和位串(三)

作者: Cache技术分享 | 来源:发表于2022-06-23 09:13 被阅读0次

第七章 操作位和位串(三)

操作位串

要创建新的位串,请使用 $bit 函数将所需位设置为 1

kill bitstring
 
set $bit(bitstring, 3) = 1
 
set $bit(bitstring, 6) = 1
 
set $bit(bitstring, 11) = 1

使用 $bit 将现有位串中的位设置为 1

set $bit(bitstring, 5) = 1

使用 $bit 将现有位串中的位设置为 0

set $bit(bitstring, 5) = 0

由于位串中的第一位是位 1,因此尝试设置位 0 会返回错误:

set $bit(bitstring, 0) = 1
 
SET $BIT(bitstring, 0) = 1
^
<VALUE OUT OF RANGE>

测试位是否已设置

要测试是否在现有位串中设置了位,还可以使用 $bit 函数:

write $bit(bitstring, 6)
1
write $bit(bitstring, 5)
0

如果测试未明确设置的位,则 $bit 返回 0:

write $bit(bitstring, 4)
0
write $bit(bitstring, 55)
0

显示位

要显示位串中的位,请使用 $bitcount 函数获取位串中位的计数,然后遍历位:

for i=1:1:$bitcount(bitstring) {write $bit(bitstring, i)}
00100100001

还可以使用 $bitcount 来计算位串中 10 的数量:

write $bitcount(bitstring, 1)
3
write $bitcount(bitstring, 0)
8

查找设置位

要查找在位串中设置了哪些位,请使用 $bitfind 函数,该函数返回指定值的下一位的位置,从位串中的给定位置开始:

Class User.BitStr
{

ClassMethod FindSetBits(bitstring As %String)
{
   set bit = 0 
   for {
      set bit = $bitfind(bitstring, 1, bit) 
      quit:'bit  
      write bit, " " 
      set bit = bit + 1 
   }
}

}

此方法搜索字符串并在 $bitfind 返回 0 时退出,表示没有找到更多匹配项。

do ##class(User.BitStr).FindSetBits(bitstring)
3 6 11

在测试位串的比较时要非常小心。

例如,可以有两个位串 b1b2,它们具有相同的位集:

do ##class(User.BitStr).FindSetBits(b1)
3 6 11
do ##class(User.BitStr).FindSetBits(b2)
3 6 11

然而,如果你比较它们,你会发现它们实际上并不相等:

write b1 = b2
0

如果你使用 zwrite,你可以看到这两个比特环的内部表示是不同的:

zwrite b1
b1=$zwc(405,2,2,5,10)/*$bit(3,6,11)*/
 
zwrite b2
b2=$zwc(404,2,2,5,10)/*$bit(3,6,11)*/

在这种情况下,b2 将第 12 位设置为 0

for i=1:1:$bitcount(b1) {write $bit(b1, i)}
00100100001
USER>for i=1:1:$bitcount(b2) {write $bit(b2, i)}
001001000010

此外,还可能存在其他内部表示,例如由 $factor 创建的表示,它将整数转换为位串:

set b3 = $factor(1060)
 
zwrite b3
b3=$zwc(128,4)_$c(36,4,0,0)/*$bit(3,6,11)*/
 
for i=1:1:$bitcount(b3) {write $bit(b3, i)}
00100100001000000000000000000000

要比较可能具有不同内部表示的两个位串,可以使用 $bitlogic 函数直接比较设置的位,如执行按位算术中所述。

执行按位算术

使用 $bitlogic 函数对位串执行按位逻辑运算。

在此示例中,有两个位串 ab

for i=1:1:$bitcount(a) {write $bit(a, i)}
100110111
for i=1:1:$bitcount(b) {write $bit(b, i)}
001000101

使用 $bitlogic 函数对位执行逻辑或:

set c = $bitlogic(a|b)

for i=1:1:$bitcount(c) {write $bit(c, i)}
101110111

使用 $bitlogic 函数对位执行逻辑与:

set d = $bitlogic(a&b)

for i=1:1:$bitcount(d) {write $bit(d, i)}
000000101

此示例说明如何使用 $bitlogic 函数执行逻辑 XOR 以测试两个位串 b1b3 是否具有相同的设置位,而不管内部表示如何:

zwrite b1
b1=$zwc(405,2,2,5,10)/*$bit(3,6,11)*/

zwrite b3
b3=$zwc(128,4)_$c(36,4,0,0)/*$bit(3,6,11)*/

write $bitcount($bitlogic(b1^b3),1)
0

逻辑异或可以快速表明两个位串的设置位没有差异。

转换为位串整数

要将常规位串转换为存储为整数的位串,请使用 $bitfind 函数查找设置的位并将它们的 2 次方相加。请记住将结果除以 2 以将位向左移动,因为常规位串中的位 1 对应于位串中的位 0

ClassMethod BitstringToInt(bitstring As %String)
{
   set bitint = 0
   set bit = 0 
   for {
      set bit = $bitfind(bitstring, 1, bit) 
      quit:'bit  
      set bitint = bitint + (2**bit) 
      set bit = bit + 1 
   }
   return bitint/2
}

将位串转换为位串为整数:

for i=1:1:$bitcount(bitstring) {write $bit(bitstring, i)}
00100100001
set bitint = ##class(User.BitStr).BitstringToInt(bitstring)
 
write bitint
1060

相关文章

  • 第七章 操作位和位串(三)

    第七章 操作位和位串(三) 操作位串 要创建新的位串,请使用 $bit 函数将所需位设置为 1: 使用 $bit ...

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

    第八章 操作位和位串(四) 操作以整数形式实现的位串 设置位 要创建一个存储为整数的新位串,请对每个位求和 2 的...

  • 第五章 操作位和位串

    第五章 操作位和位串 有时可能希望在基于数据平台的应用程序中存储一系列相关的布尔值。可以创建许多布尔变量,也可以将...

  • 第六章 操作位和位串(二)

    第六章 操作位和位串(二) 将位序列存储为整数 如果要将一系列布尔参数传递给方法,一种常见的方法是将它们作为编码为...

  • 在编程中使用集合与按位运算符

    目录 一、引言二、离散数学中的集合三、位串和按位运算符四、在编程中使用位串和按位运算符五、练习题六、拓展阅读 本文...

  • 位操作

    位操作乘、除、求余,需要乘以或除以2的n次方,都可以用移位的方法代替1、乘a=a*4 <=> a=a<<2 2、...

  • 位操作

    位操作详解 位运算的操作符有:&、|、^、~、>>、<<,六种,分别对应与,或,异或,按位取反,右位移,左位移 1...

  • 位操作

    c++中位操作操作符 这些位操作符只能用于整形的操作,其他会编译报错。位操作符的运算优先级比较低,因为尽量使用括号...

  • 位操作

    1. 把一个数上调成另一个数的倍数 2. 取某些位 取最低位, 可由数字得到相应的二进制字符串 3. 判断str与...

  • 位操作

    1.概念: ​ In digital computer programming, a bitwise ope...

网友评论

      本文标题:第七章 操作位和位串(三)

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