Delphi + Asm - TBits类的学习
技术交流,DH讲解.
在D2010的classes中有个TBits类,这个类主要是位操作的.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
TBits = classprivate FSize: Integer; FBits: Pointer; procedure Error; procedure SetSize(Value: Integer); procedure SetBit(Index: Integer; Value: Boolean); function GetBit(Index: Integer): Boolean;public destructor Destroy; override; function OpenBit: Integer; property Bits[Index: Integer]: Boolean read GetBit write SetBit; default; property Size: Integer read FSize write SetSize;end; |
这个类没有什么方法,我们看到了property Bits[Index: Integer]: Boolean read GetBit write SetBit; default;这个属性,就是读取和设置某一位的.
那我们看看它是怎么实现的?
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
//在类中Eax就是Self指针procedure TBits.SetBit(Index: Integer; Value: Boolean); assembler;asm CMP Index,[EAX].FSize //如果Indx>=Size then 扩容 JAE @@Size@@1: MOV EAX,[EAX].FBits OR Value,Value JZ @@2 BTS [EAX],Index //将Eax中第Index位赋值给CF,然后Eax第index位=1; RET@@2: BTR [EAX],Index //将Eax中第Index位赋值给CF,然后Eax第index位=0; RET@@Size: CMP Index,0 //if index <0 then Error JL TBits.Error PUSH Self //push [eax] PUSH Index PUSH ECX {Value} INC Index CALL TBits.SetSize POP ECX {Value} POP Index POP Self JMP @@1end;function TBits.GetBit(Index: Integer): Boolean; assembler;asm CMP Index,[EAX].FSize JAE TBits.Error MOV EAX,[EAX].FBits BT [EAX],Index //将eax的第Index位赋值给CF SBB EAX,EAX //eax - (eax + CF) AND EAX,1 //清除Eax中的其他位end; |
这里我们发现BTR,BTS,BT,SBB等位操作符.我们之前不是算过99999中有多少个一么?
当时我们用的方法是移位然后与,那么我们现在换个方法呢?
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
Function _1Bits(ANum: Integer): Integer;asm xor edx,edx // 位数 xor ecx,ecx // 1的个数@@nLoop: cmp edx,32 // 循环32次 je @@nExit bt eax,edx jnc @@nNoInc // if CF = 0 then inc ecx@@nNoInc: inc edx jmp @@nLoop@@nExit: mov eax,ecxend; |
全部都是直接对位操作的.
BTR和BTS的作用如上面我注释中写的那样,但是我现在没有其他例子给大家看.TBits类很纯洁,所以可以用到其他版本中去.
我是DH.
http://www.cnblogs.com/huangjacky/archive/2010/01/19/1651359.html
Delphi + Asm - TBits类的学习的更多相关文章
- 转:学习笔记: Delphi之线程类TThread
学习笔记: Delphi之线程类TThread - 5207 - 博客园http://www.cnblogs.com/5207/p/4426074.html 新的公司接手的第一份工作就是一个多线程计算 ...
- 学习笔记: Delphi之线程类TThread
新的公司接手的第一份工作就是一个多线程计算的小系统.也幸亏最近对线程有了一些学习,这次一接手就起到了作用.但是在实际的开发过程中还是发现了许多的问题,比如挂起与终止的概念都没有弄明白,导致浪费许多的时 ...
- Delphi之通过代码示例学习XML解析、StringReplace的用法(异常控制 good)
*Delphi之通过代码示例学习XML解析.StringReplace的用法 这个程序可以用于解析任何合法的XML字符串. 首先是看一下程序的运行效果: 以解析这样一个XML的字符串为例: <? ...
- ASM字节码框架学习之动态代理
ASM字节码操纵框架,可以直接以二进制的形式来来修改已经存在的类或者创建新的类.ASM封装了操作字节码的大部分细节,并提供了非常方便的接口来对字节码进行操作.ASM框架是全功能的,使用ASM字节码框架 ...
- 谈谈Delphi中的类和对象3---抽象类和它的实例
四.抽象类和它的实例 Delphi中有一个类称为是抽象类,你不能天真的直接为它创建一个实例,如 var StrLst: TString; begin StrLst:= TString.Create; ...
- php大力力 [019节]php分页类的学习
2015-08-26 php大力力019.php分页类的学习 [2014]兄弟连高洛峰 PHP教程14.2.1 分页需求分析 14:18 [2014]兄弟连高洛峰 PHP教程14.2.2 分页类中分页 ...
- Delphi中TStringList类常用属性方法详解
TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的. 常规的用法大家都知道,现在来讨论它的一些高级的用法. 先把要讨论的几个属性列出来: 1.CommaText 2.Delim ...
- 20175212童皓桢 在IDEA中以TDD的方式对String类和Arrays类进行学习
20175212童皓桢 在IDEA中以TDD的方式对String类和Arrays类进行学习 要求 在IDEA中以TDD的方式对String类和Arrays类进行学习 测试相关方法的正常,错误和边界情况 ...
- Exception类的学习与继承总结
日期:2018.11.11 星期日 博客期:023 Exception类的学习与继承总结 说起来我们上课还是说过的!老师提到了报错问题出现主要分Exception和Error两类!第一次遇见这个问题是 ...
随机推荐
- Android开发之TextView排版问题
下面直接是关于解决该问题的代码(根据别人的代码进行了修正以及测试,保证可以修改字体尺寸.颜色.根据padding调整,如果需要支持其他的格式可以将对应的属性添加至Paint类型的对象中): 1 p ...
- 静态化 - 伪静态技术(PHP正则表达式实现)
效果: 代码: <?php // + —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— // + 正则表达式,实 ...
- spark sql 基本用法
一.通过结构化数据创建DataFrame: publicstaticvoid main(String[] args) { SparkConf conf = new SparkConf() .se ...
- iOS Development: Proper Use of initWithNibName:bundle: Affects UITableViewController
Address:http://www.outofcore.com/2011/07/ios-development-proper-use-of-initwithnibnamebundle-affects ...
- Hibernate入门之配置文件
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hi ...
- Android 系统稳定性 - ANR(一)
文章都为原创,转载请注明出处,未经允许而盗用者追究法律责任.很久之前写的了,留着有点浪费,共享之.编写者:李文栋 如果你是一个Android应用程序开发人员,你的人生中不可避免的三件事情是:死亡.缴 ...
- 采用xml的方式保存数据
package com.example.myxmlmake; import java.io.File; import java.io.FileOutputStream; import java.uti ...
- [转]apache下htaccess不起作用,linux,windows详解
可能出现下面这三种的错误可能性: 第一种:启用 rewrite 和 .htaccess 设置 rewrite设置:找到apache的配置文件httpd.conf文件,找到:#LoadModule re ...
- CSS3_3D效果(IE10_火狐_谷歌)
好久没写博客了,看了下记录,上次最后写的最后一篇已经是8月1号了,最近有些小东西整理下,当巩固吧 废话少说,直奔本文主题 css3提供了很多新鲜好玩的东西,transform就是其中一个,可以进行 2 ...
- QScriptEngine
其实你有好多没有介绍 比如qt文字 我一直很迷惑qt的文字的长宽 qt文字的字间距 等等这些东西还有QProcess QProcess可能是qt调用c#的唯一方法了QScript要比你想象的重要,一个 ...