式に従って文字列内のすべての文字を合計するカスタム ハッシュを作成しています。
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;