我一直感觉 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个函数,我够用了。留在这里,周一复制到公司用。

最新文章

  1. Java8的新特性
  2. Winform窗口弹出位置控制
  3. JS调用android逻辑方法
  4. 环境搭建之maven分布式系统
  5. Excel 公式(细节若干)
  6. hdu1690 Bus System (dijkstra)
  7. memcache基础
  8. 使用vue+flask做全栈开发的全过程(实现前后端分离)
  9. QTextEdit控件使用
  10. SpringMVC ModelAndView、Map、Model、ModelMap
  11. Xpath Helper的使用
  12. Linux下chkconfig命令
  13. 嵌入式开发之zynqMp ---Zynq UltraScale+ MPSoC 图像编码板zcu102
  14. mongodb 语句和SQL语句对应(SQL to Aggregation Mapping Chart)
  15. Linux下IP SAN共享存储操作记录
  16. Bytom国密网说明和指南
  17. 在Win32程序中显示Dos调试窗口
  18. php表单中如何获取单选按钮与复选按钮的值(示例)
  19. BZOJ 1305 dance跳舞(最大流+二分答案)
  20. python命令行参数传递JSON串

热门文章

  1. React Native项目集成iOS原生模块
  2. JavaScript数据类型-2---Undefined、 Null、 Boolean、 Number、 String.
  3. JAVA基础部分复习(二、集合类型)
  4. 快排 - 快速排序算法 (Chinar出品 简单易懂)
  5. 错题:Test3
  6. Elasticsearch基本用法(1)--原生操作
  7. 【单位矩阵】【杭电OJ1575】
  8. 《DSP using MATLAB》Problem 7.1
  9. python数据类型及字符编码
  10. 【BZOJ4553】【TJOI2016】【HEOI2016】序列