Delphi循环移位操作


本文整理自网络,侵删。

 

 

 Delphi循环移位操作

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

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

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

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

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

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

function rol(const Value: Byte; ShiftValue: Byte): DWORD; overload;
begin
Result := (Value shr (8 * SizeOf(Value) ?C 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

相关阅读 >>

Delphi 实现文件分割合并

Delphi 字符串的分割

Delphi 建立快捷方式

Delphi datasnap双缓存下载文件

Delphi 判断是否是十六进制数

Delphi 用input连续记录所输入的次数

Delphi安卓动态切换本地主题

Delphi 2009 中的泛型

Delphi 判断安卓app第一次启动

Delphi 比较两数字大小取最大值

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...