私は次のメソッドを書いています:
public static int hash2(String key, int tableSize) {
int hashVal = 0;
for(int i=0; i<key.length();i++) {
hashVal = 37 * hashVal + key.charAt(i);
}
System.out.println(hashVal);
hashVal %= tableSize;
if(hashVal < 0){
hashVal += tableSize;
}
return hashVal;
}
私は、乗算や除算を使用せずにforループを書き直すという任務を負っています。私の唯一のツールは、16ビットの2進数の加算とシフトです。
どういうわけかhashValに37を掛けてから、この値にkey.charAt(i)を追加する必要があることに気付きました。私はそれを複数の方法で試しました:
for(int i=0; i<key.length();i++) {
hashVal2 = hashVal2<<19 - hashVal2;
hashVal2 += key.charAt(i);
}
また
for(int i=0; i<key.length();i++) {
hashVal2 = hashVal2<<18 + hashVal2;
hashVal2 += key.charAt(i);
}
また
for(int i=0; i<key.length();i++) {
for(int j=0; j<37;j++) {
hashVal2 += hashVal2;
}
hashVal2 += key.charAt(i);
}
ただし、これらのいずれも、hashVal(またはhashVal2)に元のメソッドと同じ値を返すことはありません。私はビットシフトを誤解していますか、それともループの原因は何かですか?他に何を試すべきかわからない。