我一直感觉 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的更多相关文章

  1. 学习笔记:7z在delphi的应用

    最近做个发邮件的功能,需要将日志文件通过邮件发送回来用于分析,但是日志文件可能会超级大,测算下来一天可能会有800M的大小.所以压缩是不可避免了,delphi中的默认压缩算法整了半天不太好使,就看了看 ...

  2. delphi连接sql存储过程

    针对返回结果为参数的 一. 先建立自己的存储过程 ALTER PROCEDURE [dbo].[REName] ) AS BEGIN select ROW_NUMBER() over(order by ...

  3. delphi 2010与delphi XE破解版的冲突

    在系统中同时安装了Dephi 2010LITE版与Delphi XE lite后,总是会有一个有问题 是因为两者都是读取C:\ProgramData\Embarcadero目录下的license文件, ...

  4. [Delphi] Delphi版本号对照

    VER300    Delphi Seattle / C++Builder Seattle    23    230    (Delphi:Win32/Win64/OSX/iOS32/iOS64/An ...

  5. delphi tidhttp 超时设置无效的解决方法

    现在delphi都发布到xe8了,tidhttp还有缺陷,那就是超时设置在没有网络或者连不上服务器的时候是无效的,不管你设置为多少都要10-20秒.connectTimeout和readTimeout ...

  6. Delphi Code Editor 之 编辑器选项

    Delphi Code Editor 之 编辑器选项 可从Code Editor的右键菜单中选择“Properties”菜单项来查看编辑器选项.也可以从主菜单[Tools | Editor Optio ...

  7. Delphi使用ADO进行数据库编程

    Delphi是一个可视化的编程工具,ADO编程也是这样,所以话不多言,直接通过代码.截图和语言来说明. 我的数据库是Oracle,为了测试,先建一个表:create table practice(un ...

  8. 怎么使用Delphi获取当前的时间,精确到毫秒

    先介绍一个可能比较常用的方法,获取当前时间 var datetime: string; begin datetime:= FormatDateTime('yyyy-mm-dd hh:mm:ss', N ...

  9. Delphi在创建和使用DLL的时候如果使用到string,请引入ShareMem单元

    当使用了长字符串类型的参数.变量时,如string,要引用ShareMem. 虽然Delphi中的string功能很强大,但若是您编写的Dll文件要供其它编程语言调用时,最好使用PChar类型.如果您 ...

  10. Delphi控件之---通过编码学习TStringGrid(也会涉及到Panel控件,还有对Object Inspector的控件Events的介绍

    我是参考了万一的博客里面的关于TStringGrid学习的教程,但是我也结合自己的实际操作和理解,加入了一些个人的补充,至少对我有用! 学用TStringGrid之——ColCount.RowCoun ...

随机推荐

  1. C# process 隐藏应用程序的进度条

    命令行参数那加上-ibck指定后台运行. string sourceFilepath = "d:\\测试.rar"; string targetFilepath = "d ...

  2. PHP目前比较常见的五大运行模式SAPI(转)

    运行模式 关于PHP目前比较常见的五大运行模式: 1)CGI(通用网关接口/ Common Gateway Interface) 2)FastCGI(常驻型CGI / Long-Live CGI) 3 ...

  3. 【leetcode】53-MaximumSubarray

    problem MaximumSubarray code class Solution { public: int maxSubArray(vector<int>& nums) { ...

  4. mxnet自定义dataloader加载自己的数据

    实际上关于pytorch加载自己的数据之前有写过一篇博客,但是最近接触了mxnet,发现关于这方面的教程很少 如果要加载自己定义的数据的话,看mxnet关于mnist基本上能够推测12 看pytorc ...

  5. Oracle使用笔记(一)

    目录 一.创建表: 二.编辑表数据: 三.Oracle基本数据类型: (一) 字符串类型 1.1:CHAR类型 CHAR(size [BYTE | CHAR]) 1.2: NCHAR类型 1.3 VA ...

  6. 第三次随笔--安装虚拟机及学习linux系统初体验

    第三次随笔--安装虚拟机及学习linux系统初体验 ·学习基于VirtualBox虚拟机安装Ubuntu图文教程在自己笔记本上安装Linux操作系统 首先按照老师的提示步骤进行VirtualBox虚拟 ...

  7. NYOJ 47:过河问题(思维)

    47-过河问题 内存限制:64MB 时间限制:1000ms 特判: No 通过数:6 提交数:10 难度:5 题目描述: 在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边.如果不借助手电筒的话 ...

  8. Blender 作的鸭脖

    鸭脖...https://www.youtube.com/watch?v=JS8V4_Ncn0w 新建一段骨骼,编辑,[E]挤出生成3段, 或者[W]细分回到物体模式,选中骨骼,属性编辑器\物体数据\ ...

  9. CentOS7安装PostgreSQL10,pgadmin4

    ======PostgreSQL10 CentOS7=================FYI:https://tecadmin.net/install-postgresql-server-centos ...

  10. (0)MySQL 的指令(包含了解知识点)

    第七章索引:入门安装 - 增删改查基本操作 - 外键(不同表之间的关联) - 数据库的建立和操作 - MySQL的查询操作(模糊.通配.限制符等) - MySQL的引擎 - MySQL的事物(数据回滚 ...