hash — побитовые операции C ++ с целым числом, такие как Mid-Square, Folding и Truncation

Я пытаюсь выполнить некоторые побитовые операции с данным ключом для программы хэш-таблицы. Методы, которые я пытаюсь выяснить, это складывание, среднеквадратичное, усечение и основание. Я не ожидаю, что кто-нибудь даст мне прямой ответ, но помогу направить меня в правильном направлении. Я не могу найти какую-либо переписку или помощь в Интернете, которая ссылается на это, или какие-либо алгоритмы, которые могут помочь. У меня есть побитовая программа, которая показывает некоторые операции над двоичными числами, такие как сдвиг, XOR, ИЛИ, И< и так далее. Чего я не понимаю, так это как выбрать только одну часть 32-битного двоичного числа, например, в середине квадрата, где вы должны выбрать средние четыре бита и использовать только те, которые в операции. Я пробовал несколько вещей, но вот что я закончил. Я думаю, что средний квадрат работает (хотя не уверен), но, кажется, работает только с большими целыми числами. Складывание и усечение определенно не работают. Я даже не пробовал метод радикса. Любая помощь, руководство или направление меня к соответствующей документации, которая была бы наиболее полезной, была бы полезна.

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);

РЕДАКТИРОВАТЬ (редакции):
Хорошо, вот некоторые изменения, которые я сделал. Я не знаю, верно ли что-либо из этого, но дайте мне знать, что можно изменить, лучше оптимизировать, и это совершенно неправильно. Я получаю вывод всеми четырьмя методами, но все ли в порядке, пока не знаю. Я не тщательно изучил каждый.

ПЕРЕСМОТРЕННЫЙ КОД:

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);

1

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]