有没有办法在delphi中没有丢失位而向左移位?

时间:2015-10-19 15:30:33

标签: delphi bit-manipulation bitwise-operators

这是交易,我正在开发一个安全系统,并且我正在使用按位操作进行一些加扰。使用4位只是为了说明,我有1001,我希望向左移。这会让我0010,因为最右边的位会丢失。我想做的是左右移动而不丢失任何位。

1 个答案:

答案 0 :(得分:3)

您可以选择使用旋转而不是移位。这保留了所有的位。如果您希望使用由换档产生的中间值,请执行旋转和换档。跟踪rotate返回的值,但使用shift返回的值。此问题提供了旋转操作的各种实现:RolDWord Implementation in Delphi (both 32 and 64 bit)?

另一种选择是永远不要修改原始值。而只是跟踪累积的转变,当需要一个值时,返回它。

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