汇编语言位向量(位映射)的实现
有些应用控制的对象是从一个有限全集中选出来的一组项目。就像公司里的雇员,或者气象监测站的环境读数。在这些情景中,二进制位可以代表集合成员。
与JavaHashSet用指针或引用指向容器内对象不同,应用可以用位向量(或位映射)把一个二进制数中的位映射为数组中的对象。
如下例所示,二进制数的位从左边0号开始,到右边31号为止,该数表示了数组元素0、1、2和31是名为SetX的集合成员:
SetX=10000000000000000000000000000111
(为了提供可读性,字节已经分开。)通过在特定位置与1进行AND运算,就可以方便地检测出该位是否为集合成员:
moveax,SetX
andeax,10000b ;元素[4]是SetX的成员吗?
如果本例中的AND指令清除了零标志位,那么就可以知道元素[4]是SetX的成员。
1)补集
补集可以用NOT指令生成,NOT指令将所有位都取反。因此,可以用下面的指令生成上例中SetX的补集,并存放在EAX中:
moveax,SetX
noteax ;Setx的补集
2)交集
AND指令可以生成位向量来表示两个集合的交集。下面的代码生成集合SetX和SetY的交集,并将其存放在EAX中:
moveax,SetX
andeax,SetY
SetX和SetY交集生成过程如下所示:
1000000000000000000000000000111(SetX) AND1000001010100000000011101100011(SetY) ————————————————————- 1000000000000000000000000000011(交集)
很难想象还有更快捷的方法生成交集。对于更大的集合来说,它所需要的位超过了单个寄存器的容量,因此,需要用循环来实现所有位的AND运算。
3)并集
OR指令生成位图表示两个集合的并集。下面的代码产生集合SetX和SetY的并集,并将其存放在EAX中:
moveax,SetX
oreax,SetY
OR指令生成SetX和SetY并集的过程如下所示:
1000000000000000000000000000111(SetX) OR1000001010100000000011101100011(SetY) ————————————————————- 1000001010100000000011101100111(并集)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。