ハッシュ テーブル プログラムの特定のキーに対してビット演算を実行しようとしています。私が理解しようとしている方法は、フォールディング、ミッドスクエア、切り捨て、および基数です。誰かが私に直接の答えをくれるとは思っていませんが、私を正しい方向に導く手助けをしてください。これを参照する通信やヘルプ、または役立つ可能性のあるアルゴリズムをオンラインで見つけることができません。シフト、XOR、OR、AND< など、2 進数の演算の一部を示すビット単位のプログラムがあります。私が理解していないのは、32 ビットの 2 進数の 1 つの部分のみを選択する方法です。たとえば、中央の 4 ビットを選択し、それらだけを演算に使用する正方形などです。いろいろ試してみましたが、以下の方法に行き着きました。ミッドスクエアは機能すると思います(確かではありませんが)、しかし、大きな整数でのみ機能するようです。折りたたみと切り捨ては確実に機能していません。私は基数法を試みたことさえありません。ヘルプ、ガイダンス、または最も役立つ適切なドキュメントへの参照は素晴らしいでしょう。
int location = 0;
if(hFunction == FOLDING){
location = (key & 0xff000000) >> 2;
location = location + ((key & 0x00ff0000) >> 2);
location = location + ((key & 0x0000ff00) >> 2);
location = location + ((key & 0x000000ff) >> 2);
cout << "\n" << location << "\n"; // for debuggin
}
else if(hFunction == MIDSQUARE){
location = ((key * key) & 0x00ffff00) >> 2;
cout << "\n" << location << "\n"; // for debuggin
}
else if(hFunction == TRUNCATION){
location = (key & 0x000ffff0) << 1;
cout << "\n" << location << "\n"; // for debugging
}
else if(hFunction == RADIX){
return(0);
}
// Divsion Method
location %= tableSize;
keys++;
return(location);
編集(改訂):わかりました、ここに私が行ったいくつかの改訂があります。これらのいずれかが正しいかどうかはわかりませんが、何が変更され、より最適化され、完全に間違っているかを教えてください。4つの方法すべてで出力が得られますが、大丈夫かどうかはまだわかりません。一つ一つ詳しく調べていません。
改訂されたコード:
int location = 0;
// splits key and adds the sections together - discards remainder
if(hFunction == FOLDING){
while (key != 0){
location = location + key % 100;
key = key / 100;
}
//cout << location << "\n"; // for debugging
}
// squares the key and then shifts right 2 spaces
else if(hFunction == MIDSQUARE){
location = ((key * key) & 0x00ffff00) << 2;
//cout << location << "\n"; // for debugging
}
// mods the key by 100, then divides by 10, splitting it into different digits,
// then adds those digits together
else if(hFunction == TRUNCATION){
while (key != 0){
location = location + key % 100;
key = key / 10;
}
//cout << location << "\n"; // for debugging
}
// converts the key to a character array while also taking all digits of the key and
// multiplying them by base 5, then converts back to an integer
else if(hFunction == RADIX){
char buffer[33];
_itoa_s(key, buffer, 5);
//cout << key; // for debugging
//system("pause"); // for debugging
location = atoi(buffer);
//cout << location << "\n"; // for debugging
}
// Divsion Method
location %= tableSize;
keys++; // counts the keys per hash table
return(location);