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
事情是这样的,我正在开发一个安全系统,我正在使用按位运算进行一些加扰。使用 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