delphi有没有办法左移而不丢失位?

Is there a way to shift left without losing bits in delphi?

事情是这样的,我正在开发一个安全系统,我正在使用按位运算进行一些加扰。使用 4 位只是为了说明,假设我有 1001 并且我希望向左移动。这将给我留下 0010 因为最右边的位会丢失。我想做的是在不丢失任何位的情况下左右移动。

您可能会选择使用旋转而不是移位。这保留了所有位。如果您希望使用作为移位结果的中间值,请同时执行旋转和移位。跟踪旋转后的 return 值,但使用移位后的 return 值。这个问题提供了旋转操作的各种实现:

另一种选择是永远不修改原始值。相反,只需跟踪累积偏移,当需要一个值时,return 它。

type
  TLosslessShifter = record
  private
    FData: Cardinal;
    FShift: Integer;
    function GetValue: Cardinal;
  public
    class function New(Data: Cardinal): TLosslessShifter; static;
    procedure Shift(ShiftIncrement: Integer);
    property Value: Cardinal read GetValue;
  end;

class function TLosslessShifter.New(Data: Cardinal): TLosslessShifter;
begin
  Result.FData := Data;
  Result.FShift := 0;
end;

procedure TLosslessShifter.Shift(ShiftIncrement: Integer);
begin
  inc(FShift, ShiftIncrement);
end;

function TLosslessShifter.GetValue: Cardinal;
begin
  if FShift > 0 then
    Result := FData shr FShift
  else
    Result := FData shl -FShift;
end;

一些示例用法和输出:

var
  Shifter: TLosslessShifter;
....
Shifter := TLosslessShifter.New(8);
Shifter.Shift(-1);
Writeln(Shifter.Value);
Shifter.Shift(5);
Writeln(Shifter.Value);
Shifter.Shift(-4);
Writeln(Shifter.Value);

输出:

16
0
8