Delphi Конвертировать набор битов как TBits в целое число или целое число без знака - PullRequest
0 голосов
/ 20 мая 2018

У меня есть значение от nor или xor gate, представленное в виде TBits, и я хочу преобразовать его в общую переменную, такую ​​как целое или целое число без знака, мой текущий рабочий Токио 10.2

var
  ABits: TBits;
  AComulative: UInt32;

const
  PosBitFromSensor1 = 0;
  PosBitFromSensor2 = 1;

begin
  ABits := TBits.Create;
  try
    ABits.Size := 32;
    {GetValFromSensor return Boolean type}
    ABits.Bits[PostBitFromSensor1] := GetValFromSensor(PosBitFromSensor1); 
    ABits.Bits[PostBitFromSensor2] := GetValFromSensor(PosBitFromSensor2);
    AComulative := SomeBitsConvertToInteger(ABits); {some function like this}
  finally
    ABits.Free;
  end;
end;

или любое простое решение.

Ответы [ 3 ]

0 голосов
/ 21 мая 2018

это решение, предоставленное @Victoria и @LURD, может быть полезно для других, имеющих ту же проблему решения.извините за мой английский.

type
  TBitsHelper = class helper for TBits
  public
    function ToUInt32: UInt32;
  end;

{ TBitsHelper }

function TBitsHelper.ToUInt32: UInt32;
type
  PUInt32 = ^UInt32;
begin
  if Size > SizeOf(Result) * 8 then
    raise EOverflow.Create('Size overflow!');
  with Self do
    Result := PUInt32(FBits)^;
end;
0 голосов
/ 21 мая 2018

Это не будет очень быстро, но вы можете делать обычные битовые манипуляции, устанавливая каждый бит, который соответствует «true» в логическом массиве.Например:

function SomeBitsConvertToInteger(ABits: TBits): UInt32;
var
  i: Integer;
begin
  if ABits.Size <> SizeOf(Result) * 8 then
    raise EBitsError.Create('Invalid bits size');
  Result := 0;
  for i := 0 to Pred(SizeOf(Result) * 8) do
    Result := Result or UInt32((Ord(ABits[i]) shl i));
end;
0 голосов
/ 20 мая 2018

может быть что-то вроде этого:

type

  {$IF CompilerVersion > 32} // tokyo
    {$MESSAGE Fatal 'Check if TBits still has the exact same fields and adjust the IFDEF'}
  {$ENDIF}
  TPrivateAccessBits = class
  public
    FSize: Integer;
    FBits: Pointer;
  end;

Move(@TPrivateAccessBits(ABits).FBits, AComulative, sizeOf(AComulative));
...