我一直感觉 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
end;
type
// 位读
function GetBit(AValue:Byte;AIndex:TBitID):TBit;
const Bool_Bit:array[False..True] of TBit = (0,1);
begin
end;
// 位写
procedure SetBit(var AValue:Byte;AIndex:TBitID;ABit:TBit);
begin
end;
// 位取反
procedure NotBit(var AValue:Byte;AIndex:TBitID);
begin
end;
很简单O(∩_∩)O~
同时,我稍微看了一下 TBits
也很好使。
如果 大于 8位以上的 “bit”,就没有办法用我之前的那些函数。
好彩,TBits 也可以。
也很简单。
缺陷是,没办法直接得到一个 Integer (由Size个Bit组成的Integer,毕竟这只是一个管理每个位置是F,还是T的类而已)
顺便,唯一一个函数 OpenBit ,其实是指第一个为false的位置是哪里,例子中返回“1”。
那3个函数,我够用了。留在这里,周一复制到公司用。