我正在开发一个项目,需要非常有效地操作一组 32 位。内存效率至关重要,因此使用布尔数组(占用 32 个字节)不是一个选择(如果我可以有其他选择,速度是最重要的)。
这是我为 TBitSet32 设想的结构:
TBitSet32 = record
value: ?integer?; // I'm not sure about the datatype here. Should it be Integer or another type?
// Gets the value associated with a particular bit index.
function valueForBit(index: integer): boolean;
// Returns the number of marked bits in the set.
function count: integer;
// Marks the specified bit.
procedure markBit(value: boolean; index: integer);
end;
对于值字段,我认为我需要一个 32 位整数类型。 Integer 这里的选择正确吗?如何实现 valueForBit、count 和 markBit 方法?
如果您对此记录有任何见解或示例实现,我将不胜感激。
如果您正好需要 32 位,那么
(U)Int32
会比 Integer
更有意义。剩下的只是使用 and
、or
和 shl
/shr
运算符进行位操作,例如:
type
TBitSet32 = record
value: UInt32;
// Gets the value associated with a particular bit index.
function valueForBit(index: integer): boolean;
// Returns the number of marked bits in the set.
function count: integer;
// Marks the specified bit.
procedure markBit(value: boolean; index: integer);
end;
function TBitSet32.valueForBit(index: integer): boolean;
begin
Result := ((value shr index) and 1) <> 0;
end;
function TBitSet32.count: integer;
var
I: Integer;
begin
Result := 0;
for I := 0 to 31 do begin
if (value and (1 shr I)) <> 0 then
Inc(Result);
end;
end;
procedure markBit(value: boolean; index: integer);
begin
if value then
value := value or (1 shr index)
else
value := value and not (1 shr index);
end;