RSS订阅 | 匿名投稿
您的位置:网站首页 > 函数 > 正文

Delphi循环移位操作

作者:admin 来源: 日期:2014/2/20 22:15:22 人气: 标签:

 

 Delphi循环移位操作

如果在X86计算机上很简单,直接内嵌汇编ror和rol指令就是循环移位.
但是如果在Android的平台上,asm关键字是无效的.
只能自己实现.

function ror(const Value: DWORD; ShiftValue: Byte): DWORD; overload;
begin
Result := (Value shl (8 * SizeOf(Value) – ShiftValue)) or
(Value Shr ShiftValue);
end;

function ror(const Value: WORD; ShiftValue: Byte): DWORD; overload;
begin
Result := (Value shl (8 * SizeOf(Value) – ShiftValue)) or
(Value Shr ShiftValue);
end;

function ror(const Value: Byte; ShiftValue: Byte): DWORD; overload;
begin
Result := (Value shl (8 * SizeOf(Value) – ShiftValue)) or
(Value Shr ShiftValue);
end;

function rol(const Value: DWORD; ShiftValue: Byte): DWORD; overload;
begin
Result := (Value shr (8 * SizeOf(Value) – ShiftValue)) or
(Value Shl ShiftValue);
end;

function rol(const Value: WORD; ShiftValue: Byte): DWORD; overload;
begin
Result := (Value shr (8 * SizeOf(Value) – ShiftValue)) or
(Value Shl ShiftValue);
end;

function rol(const Value: Byte; ShiftValue: Byte): DWORD; overload;
begin
Result := (Value shr (8 * SizeOf(Value) – ShiftValue)) or
(Value Shl ShiftValue);
end;

举例子:
a := ror(DWORD(1), 1);
注意第一个参数因为给的是常量1,如果不指明类型会按最小的来,也就是会被当成Byte的.

如果是C++用模板不必重载写两个函数就够了.而象Delphi/C#/Java的泛型没法做到这个.
因为C++的泛型是编译时替换的,完全没有类型信息.
而后三种语言首先你要把T做移位就会编译不过.

 

来源:http://www.raysoftware.cn/?p=490


读完这篇文章后,您心情如何?
0
0
0
0
0
0
0
0
本文网址: