如何在Delphi中创建TBitSet32记录以实现高效的32位操作?

问题描述 投票:0回答:1

我正在开发一个项目,需要非常有效地操作一组 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 方法?

如果您对此记录有任何见解或示例实现,我将不胜感激。

delphi pascal freepascal
1个回答
0
投票

如果您正好需要 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;
© www.soinside.com 2019 - 2024. All rights reserved.