【发布时间】:2011-05-16 09:36:59
【问题描述】:
Result:= b8;
Result:= Result+ (b7 SHL 8);
Result:= Result+ (b6 SHL 16);
Result:= Result+ (b5 SHL 24);
Result:= Result+ (b4 SHL 32);
Result:= Result+ (b3 SHL 40); <------ here
Result:= Result+ (b2 SHL 48);
Result:= Result+ (MSB SHL 56);
(结果为 int64,b1-b8 为字节)。
但编译器抱怨“常量 exp 违反子范围界限”。 然后我在一个网站上发现了这个警告“编译器将拒绝超过 32 的硬编码右移值,除非数据类型是 Int64。Shl 也是如此”。 Delphi Help 对此只字未提。为什么有限制?我能阻止它吗?也许是编译器指令之类的?我可以使用乘法来克服它,但它会更慢。有更快的方法吗?
编辑: 我也在考虑创建两个红衣主教,因为我可以在红衣主教上使用 SHL,然后将红衣主教合并在一起。这将只需要一次乘法。还有其他想法吗?
编辑2: 该代码是将数字从 255 转换为 256(反之亦然)的算法的一部分。我这样做了 500 亿次;所以速度很重要。
【问题讨论】:
-
结果是 Int64 类型?还有b3?你能插入一个类型转换到 Int64: Int64(b3) 吗?
-
对不起。对不起。我完全忘记了这一点。我更新了我的问题。
标签: delphi