我正在构建一个自定义哈希,我根据公式将字符串中的所有字母相加:
string[0] * 65536 + string[1] * 32768 + string[2] * 16384 + ...
我遇到了一个问题,是否应该将这些数字定义为 int 数组中的常量,如下所示:
const int MULTIPLICATION[] = {
65536,
32768,
16384,
8192,
4096,
2048,
1024,
512,
256,
128,
64,
32,
16,
8,
4,
2,
1
}
或者,也许我应该在计算哈希本身时生成这些数字(同时可能由于它们尚未生成而损失一些速度)?我需要数百万次计算这个哈希值,我希望编译器理解的主要内容是,而不是正常的 MUL 操作
MOV EBX, 8
MUL EBX
它会做
SHL EAX, 3
编译器是否理解如果我乘以 2 的幂来移位而不是通常的乘法?
另一个问题,我很确定当你用 c++ number *= 2; 编写时它确实会移位。但只是为了澄清,是吗?
谢谢,我发现了如何在调试器中查看反汇编。是的,如果您像这样使用编译器,编译器确实知道移位
number *= 65536
但是,如果你这样做,它会做正常的乘法
number1 = 65536
number *= number1;