Delphi 的 Bit
我一直感觉 Delphi 下的Bit操作不是很好使,
所以一直屏蔽着这方面的学习。不过最近收集整理了一下代码。
原因是这样的。
由于某个需求被分解成 在 0~n(不定) 中,有几个数字被置换成了“true”
由于我自己写了一个类来管理某个Record,而这个Record是用Variant来作为参数。(类似TDataSet)。
开始的时候,我想着吧,用 array of Boolean,可惜Variant 中怎么
v:=VarCreateVariant([0,n],varBoolean)
不会操作 v[10]:=true 这种事情。
于是干脆变成了 array of Byte
声明了8个array of Byte(注意这个数字,很巧的是,需求上的数字竟然是8)
开始的时候我没有太在意,而我一个尚在实习期的的同事说起,这8个array不就是一个array of Byte吗?
(呵呵,现在的学生都很强啊!!!)
没错,我声明了8组 array of Byte,而事实上,真正使用的永远是0,1两个数字。
所以,我的计划改变,需要1组 array of Byte,而由1个Byte,来同时控制8组内容。
尽管,n是在动态中被分配的,8组内容的长度原本就不同,现在,我只要留下最长的那组,其他7组舍弃,
岂不是即节约了内容,又节约了时间?!?!?!?
废话就这么多。
且看我整理的关于Bit的内容。
// 得到是1的个数
Function Count1Bit(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,ecx
end;
type
TBit = 0..1;
TBitID = 1..8;
// 位读
function GetBit(AValue:Byte;AIndex:TBitID):TBit;
const Bool_Bit:array[False..True] of TBit = (0,1);
begin
Result:=Bool_Bit[AValue and (1 shl (AIndex-1))<>0];
end;
// 位写
procedure SetBit(var AValue:Byte;AIndex:TBitID;ABit:TBit);
begin
if ABit=0 then
AValue:=AValue and not (1 shl (AIndex-1))
else
AValue:=AValue or (1 shl (AIndex-1));
end;
// 位取反
procedure NotBit(var AValue:Byte;AIndex:TBitID);
begin
AValue:=AValue xor (1 shl (AIndex-1));
end;
很简单O(∩_∩)O~ 可惜我没太在意理解其中的变化过程,时间有限,能用即可。
同时,我稍微看了一下 TBits
也很好使。
如果 大于 8位以上的 “bit”,就没有办法用我之前的那些函数。
好彩,TBits 也可以。
bb:=TBits.Create;
bb.Size:=8;
bb[0]:=true;
bb[7]:=true;
也很简单。
缺陷是,没办法直接得到一个 Integer (由Size个Bit组成的Integer,毕竟这只是一个管理每个位置是F,还是T的类而已)
顺便,唯一一个函数 OpenBit ,其实是指第一个为false的位置是哪里,例子中返回“1”。
那3个函数,我够用了。留在这里,周一复制到公司用。
Delphi 的 Bit的更多相关文章
- 学习笔记:7z在delphi的应用
最近做个发邮件的功能,需要将日志文件通过邮件发送回来用于分析,但是日志文件可能会超级大,测算下来一天可能会有800M的大小.所以压缩是不可避免了,delphi中的默认压缩算法整了半天不太好使,就看了看 ...
- delphi连接sql存储过程
针对返回结果为参数的 一. 先建立自己的存储过程 ALTER PROCEDURE [dbo].[REName] ) AS BEGIN select ROW_NUMBER() over(order by ...
- delphi 2010与delphi XE破解版的冲突
在系统中同时安装了Dephi 2010LITE版与Delphi XE lite后,总是会有一个有问题 是因为两者都是读取C:\ProgramData\Embarcadero目录下的license文件, ...
- [Delphi] Delphi版本号对照
VER300 Delphi Seattle / C++Builder Seattle 23 230 (Delphi:Win32/Win64/OSX/iOS32/iOS64/An ...
- delphi tidhttp 超时设置无效的解决方法
现在delphi都发布到xe8了,tidhttp还有缺陷,那就是超时设置在没有网络或者连不上服务器的时候是无效的,不管你设置为多少都要10-20秒.connectTimeout和readTimeout ...
- Delphi Code Editor 之 编辑器选项
Delphi Code Editor 之 编辑器选项 可从Code Editor的右键菜单中选择“Properties”菜单项来查看编辑器选项.也可以从主菜单[Tools | Editor Optio ...
- Delphi使用ADO进行数据库编程
Delphi是一个可视化的编程工具,ADO编程也是这样,所以话不多言,直接通过代码.截图和语言来说明. 我的数据库是Oracle,为了测试,先建一个表:create table practice(un ...
- 怎么使用Delphi获取当前的时间,精确到毫秒
先介绍一个可能比较常用的方法,获取当前时间 var datetime: string; begin datetime:= FormatDateTime('yyyy-mm-dd hh:mm:ss', N ...
- Delphi在创建和使用DLL的时候如果使用到string,请引入ShareMem单元
当使用了长字符串类型的参数.变量时,如string,要引用ShareMem. 虽然Delphi中的string功能很强大,但若是您编写的Dll文件要供其它编程语言调用时,最好使用PChar类型.如果您 ...
- Delphi控件之---通过编码学习TStringGrid(也会涉及到Panel控件,还有对Object Inspector的控件Events的介绍
我是参考了万一的博客里面的关于TStringGrid学习的教程,但是我也结合自己的实际操作和理解,加入了一些个人的补充,至少对我有用! 学用TStringGrid之——ColCount.RowCoun ...
随机推荐
- Git的小总结
1.Git的介绍 Git(分布式版本控制系统)是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. 下载地址:https://git-scm.com 2.介绍命令 $ git ...
- POJ2777-Count Color (线段树)
题目传送门:http://poj.org/problem?id=2777 Count Color Time Limit: 1000MS Memory Limit: 65536K Total Sub ...
- 2.19 cookie相关操作
2.19 cookie相关操作 前言虽然cookie相关操作在平常ui自动化中用得少,偶尔也会用到,比如登录有图形验证码,可以通过绕过验证码方式,添加cookie方法登录.登录后换账号登录时候,也可作 ...
- Python之路,第十篇:Python入门与基础10
python3 函数 函数(function) 什么是函数: 函数是可以重复执行的代码块,可以重复使用: 作用: 定义用户级的函数:实现了一个代码块的封装: 语法: def 函数名(参数列表): ...
- 区块链与Git版本工具的比较
区块链与Git版本工具的比较 来源:http://www.jianshu.com/p/b96b98983df6 作者: 梁波林 相同点: 1. 分布式存储方案 2. 链式数据 3. 去中心化 4. ...
- Unity读取AssetBundle资源全教程(所有读取方式)
读取/加载 AssetBundle 资源的多种方式 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Ch ...
- 论Injection的前世今生
Click me~ why Java EE provides injection mechanisms that enable your objects to obtain references to ...
- seo:网站被黑的预防及处理方法
一.网站被黑的类型有哪些 1.网站挂木马 :通过网站后台 FTP等植入恶意代码 2.网站域名被恶意泛解析 3.跳转 4.百度快照劫持:黑客劫持快照在你不工作的时候进入你的网站的,一般是凌晨1点到5. ...
- 2018.4.23 git命令总结
git clone git pull git add xx git add . git add -A git branch 查看本地分支 git branch --all 查看所有分支 git bra ...
- 大型网站系统与Java中间件实践读书笔记
转载:http://blog.csdn.net/ioscodelover/article/details/45047869 1.分布式系统相对集中式而言,是指多台计算机互相通过消息通信进行协作而对外提 ...