汇编语言位向量(位映射)的实现

有些应用控制的对象是从一个有限全集中选出来的一组项目。就像公司里的雇员,或者气象监测站的环境读数。在这些情景中,二进制位可以代表集合成员。

与 Java HashSet 用指针或引用指向容器内对象不同,应用可以用位向量(或位映射)把一个二进制数中的位映射为数组中的对象。

如下例所示,二进制数的位从左边 0 号开始,到右边 31 号为止,该数表示了数组元素 0、1、2 和 31 是名为 SetX 的集合成员:

SetX = 10000000 00000000 00000000 00000111

(为了提供可读性,字节已经分开。)通过在特定位置与 1 进行 AND 运算,就可以方便地检测出该位是否为集合成员:

mov eax,SetX
and eax, 10000b   ;元素[4]是 SetX 的成员吗?

如果本例中的 AND 指令清除了零标志位,那么就可以知道元素[4]是 SetX 的成员。

1) 补集

补集可以用 NOT 指令生成,NOT 指令将所有位都取反。因此,可以用下面的指令生成上例中 SetX 的补集,并存放在 EAX 中:

mov eax,SetX
not eax                  ;Setx的补集

2) 交集

AND 指令可以生成位向量来表示两个集合的交集。下面的代码生成集合 SetX 和 SetY 的交集,并将其存放在 EAX 中:

mov eax,SetX
and eax,SetY

SetX 和 SetY 交集生成过程如下所示:

        1000000000000000000000000000111 (SetX)
AND    1000001010100000000011101100011 (SetY)
————————————————————-
        1000000000000000000000000000011 (交集)

很难想象还有更快捷的方法生成交集。对于更大的集合来说,它所需要的位超过了单个寄存器的容量,因此,需要用循环来实现所有位的 AND 运算。

3) 并集

OR 指令生成位图表示两个集合的并集。下面的代码产生集合 SetX 和 SetY 的并集,并将其存放在 EAX 中:

mov eax,SetX
or eax,SetY

OR 指令生成 SetX 和 SetY 并集的过程如下所示:

       1000000000000000000000000000111 (SetX)
OR    1000001010100000000011101100011 (SetY)
————————————————————-
       1000001010100000000011101100111 (并集)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 解析四则表达式的编译过程及生成汇编代码

    1.前序这是编译原理的实验,自认为是上大学以来做过的最难的一个实验.实验用到的基础知识:C语言.数据结构.汇编(只需简单的了解).开发工具:VC 2.问题描述编译整数四则运算表达式,将整数四则运算表达式翻译为汇编语言代码.消除左递归后的文法:E→TE'E'→+TE' |εT→FT'T'→*FT' |εF→(E) | i消除左递归后的翻译模式:E ::=     T    {E'.i:=T.nptr}E'    {E.nptr:=E'.s}E'::=      + T  {E'1.i:=mknod

  • 从汇编看c++函数的默认参数的使用说明

    在c++中,可以为函数提供默认参数,这样,在调用函数的时候,如果不提供参数,编译器将为函数提供参数的默认值.下面从汇编看其原理. 下面是c++源码: 复制代码 代码如下: int add(int a = 1, int b = 2) {//参数a b有默认值    return a + b;}int main() {   int c= add();//不提供参数 } 下面是mian函数里面的汇编码: 复制代码 代码如下: ; 4    : int main() { push    ebp    m

  • 汇编语言常见错误信息中文注解

    本文的目标是收集大部分汇编中常见错误信息及对其的中文注解,方便大家在写汇编程序时能够快速地定位错误并解决问题. ml.exe错误信息: 复制代码 代码如下: FATAL   严重错误 cannot open file不能打开文件 I/O error closing fileI/O错误 正在关闭文件 I/O error writing fileI/O错误 正在写文件 I/O error reading file            I/O错误 正在读取文件 out of memory      

  • 从汇编看c++的默认析构函数的使用详解

    c++中,如果没有为一个类提供析构函数,那么编译器会为这个类提供默认的析构的函数.由于析构函数的功能和构造函数相反,因此和默认的构造函数类似,编译器也会提供无用的默认的析构函数,和非无用的析构函数.两者的分析情况一样(对于默认的构造函数分析,请参看<从汇编看c++中默认构造函数的使用分析>).并且编译器会提供非无用的默认析构函数情形和默认构造函数类似: 1 类含有虚成员函数(类继承自虚基类或者继承的基类含有虚成员函数,也属于这种情况) 2 类继承自一个基类,基类含有自定义析构函数(如果基类没有

  • 汇编语言 口算异或xor小结

    复制代码 代码如下: 123 145 167 189 1AB 1CD 1EF 246 257 28A 29B 2CE 2DF 347 356 38B 39A 3CF 3DE 48C 49D 4AE 4BF 58D 59C 5AF 5BE 68E 69F 6AC 6BD 78F 79E 7AD 7BC

  • 汇编优化提示

    你需记住的最重要的事情就是代码花费的时间!不同的方法可以加速你的代码或者不能,所以你要多多尝试.因而计算代码花费的时间来看看你尝试的每个方法是否可以提速是件很重要的事情. :=========================初级========================= <1>释放所有8-CPU寄存器,以使它们用于你自己的代码中 复制代码 代码如下: push ebx push esi push edi push ebp :必须在改变ESP之前完成 :装载ESI.EDI和其他传递栈中值

  • 汇编语言超浓缩教程

    所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样).某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了.为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ--).但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP.WINRAR-依次压迫,嘿嘿!

  • 汇编语言无效指令错误概述

    问题:cmpxchg8b 指令比较一个8字节值edx和EAX带有8字节值内存( 目的地操作数). 只有有效目标操作数用于此指令是内存 操作数. 如果目标操作数是一个寄存器处理器应产生一个 无效OpCode例外,执行的指令cmpxchg8b应当停止和 处理器应该执行无效OpCode异常处理程序. 此错误发生是 锁定前缀为使用cmpxchg8b指令与一个(无效)寄存器目的地 操作数. 在这种情况下,处理器可能无法启动执行无效OpCode 异常处理程序,因为总线已锁定. 这将导致系统挂起. 提示:如果

  • 汇编语言位向量(位映射)的实现

    有些应用控制的对象是从一个有限全集中选出来的一组项目.就像公司里的雇员,或者气象监测站的环境读数.在这些情景中,二进制位可以代表集合成员. 与 Java HashSet 用指针或引用指向容器内对象不同,应用可以用位向量(或位映射)把一个二进制数中的位映射为数组中的对象. 如下例所示,二进制数的位从左边 0 号开始,到右边 31 号为止,该数表示了数组元素 0.1.2 和 31 是名为 SetX 的集合成员: SetX = 10000000 00000000 00000000 00000111 (

  • 浅谈Java中Unicode的编码和实现

    Unicode的编码和实现 大概来说,Unicode编码系统可分为编码方式和实现方式两个层次. 编码方式 字符是抽象的最小文本单位.它没有固定的形状(可能是一个字形),而且没有值."A"是一个字符,"€"也是一个字符.字符集是字符的集合.编码字符集是一个字符集,它为每一个字符分配一个唯一数字. Unicode 最初设计是作为一种固定宽度的 16 位字符编码.也就是每个字符占用2个字节.这样理论上一共最多可以表示216(即65536)个字符.上述16位统一码字符构成基

  • 浅谈Unicode与JavaScript的发展史

    一.Unicode是什么? Unicode源于一个很简单的想法:将全世界所有的字符包含在一个集合里,计算机只要支持这一个字符集,就能显示所有的字符,再也不会有乱码了. 它从0开始,为每个符号指定一个编号,这叫做"码点"(codepoint).比如,码点0的符号就是null(表示所有二进制位都是0). 复制代码 代码如下: U+0000 = null 上式中,U+表示紧跟在后面的十六进制数是Unicode的码点. 目前,Unicode的最新版本是7.0版,一共收入了109449个符号,其

  • 关于图片存储格式的整理(BMP格式介绍)

    BMP BMP(全称Bitmap)是Window操作系统中的标准图像文件格式 可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广. 它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大.BMP文件的图像深度可选lbit.4bit.8bit及24bit.BMP文件存储数据时,图像的扫描方式是按从左到右.从下到上的顺序.由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都

  • JavaScript语言对Unicode字符集的支持详解

    上个月,我做了一次分享,详细介绍了Unicode字符集,以及JavaScript语言对它的支持.下面就是这次分享的讲稿. 一.Unicode是什么? Unicode源于一个很简单的想法:将全世界所有的字符包含在一个集合里,计算机只要支持这一个字符集,就能显示所有的字符,再也不会有乱码了. 它从0开始,为每个符号指定一个编号,这叫做"码点"(code point).比如,码点0的符号就是null(表示所有二进制位都是0). 复制代码 代码如下: U+0000 = null 上式中,U+表

  • 详细解读linux下swap分区的作用

    本文研究的主要是linux下swap分区的相关内容,具体介绍如下. swap分区介绍 嵌入式Linux中文站消息,Linux系统的Swap分区,即交换区,Swap空间的作用可简单描述为:当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用.那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap中恢复保存的数据到内存中.这样,系统总是在物理内存不够时,才进行Swap交换.其实,S

  • JavaWeb中文编码问题实例讲解

    一.JavaWeb编程中乱码的成因 因为计算机只认识0与1,在网络上要想传输各种字符就需要进行编码.而由于编码.传输.解码过程存在各种不确定性,导致乱码问题频发,成为困扰初学者的一大问题.本文就试图用最简单的示例解释乱码问题. 1.为什么会出现乱码问题 如同发电报一样,如果发报的采用一个密码本进行发报,而接收端采用另外的密码本进行解码,肯定会导致无法解码一样.如果在计算机网络中传输数据,发送端采用的编码和接收端采用的编码不一致就会导致乱码问题. 2.认识各种编码: ASCII: ASCII(Am

  • Java数据类型之细讲char类型与编码关系

    一.开头 Java是一种强类型的语言,这意味着必须为每一个变量声明一种类型 Java中一共有8种基本数据类型(整形有4种,浮点型有2种,字符型1种,还有一种布尔类型) 由于Java程序必须保证在所有机器上都能得到相同的运行结果,所以各种数据类型的取值范围必须是固定的 二.整形 整形共有4种 byte:一个字节 short:2个字节 int:4个字节(刚好超过二十亿) long int:8个字节 这里要注意的一些地方是 长整形数值有一个后缀L或者l 十六进制数值有一个前缀0x或者0X 八进制有一个

  • Java中关于字符串的编码方式

    目录 字符串的编码方式 idea中默认的字符串编码方式为utf-8 utf-8和GBK中字符串所占用的字节数 设置字符串编码.转码 UTF-8 UTF-16 UTF-32 java中编码 解决编码乱码 字符串的编码方式 UTF-8是Unicode的一种实现方式,也就是它的字节结构有特殊要求,所以我们说一个汉字的范围是0X4E00到0x9FA5,是指unicode值,至于放在utf-8的编码里去就是由三个字节来组织,所以可以看出unicode是给出一个字符的范围,定义了这个字是码值是多少,至于具体

  • 解决 Redis 数据倾斜、热点等问题

    目录 什么是数据倾斜? 数据倾斜有哪些原因呢? 1.存在大key 2.HashTag 使用不当 3.slot 槽位分配不均 Redis 作为一门主流技术,应用场景非常多,很多大中小厂面试都列为重点考察内容 前几天有星球小伙伴学习时,遇到下面几个问题,来咨询 Tom哥 考虑到这些问题比较高频,工作中经常会遇到,这里写篇文章系统讲解下 问题描述: 1.如果redis集群出现数据倾斜,数据分配不均,该如何解决? 2.处理hotKey时,为key创建多个副本,如k-1,k-2…, 如何让这些副本能均匀写

随机推荐