Как да третираме стойността на байта като int в java

Опитвам се да направя изчислението на хеш-кода ръчно на низ, тъй като казва формулата за хеш-код на низ като " s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]", както по-долу

    public static void main(String[] args) {

        String str1 = new String("A");

        double hc = 0;
        for (int i = 0; i < str1.length(); i++) {
            int iv = (byte) str1.charAt(i);
            hc = hc + Math.pow((iv * 31), (str1.length() - 1 - i));
        }

        System.out.println(hc);              // 1.0
        System.out.println(str1.hashCode()); // 65
    }

Стойността на 'hc' е 1,0, защото java преобразува байт в int стойност според правилата. но отговорът, който търся, е 65. Как да копирам байтова стойност, такава каквато е, в int променлива.


person Murali    schedule 07.08.2019    source източник
comment
Подсказка: Щракнете с Ctrl или Cmd върху hashCode() във вашата IDE и това трябва да ви отведе до неговия изходен код. Там ще получите отговора. Никъде не пише, че знаците се преобразуват в байтове. Защо правиш това?   -  person JB Nizet    schedule 07.08.2019
comment
Може би мислите, че низовете са направени от байтове? Те не са, те са направени от chars, които са 16 бита широки.   -  person DodgyCodeException    schedule 07.08.2019
comment
Вместо String str1 = new String("A"); трябва просто да направите String str1 = "A";.   -  person DodgyCodeException    schedule 07.08.2019
comment
@JBNizet Искам да го кодирам ръчно, основно искам да знам как да копирам байтова стойност, такава каквато е, в int променлива.. Не го намерих в изходния код. Благодаря   -  person Murali    schedule 07.08.2019
comment
@DodgyCodeException, знам, че String са направени от знаци. String str1 = "A"; това няма да помогне, дава същия резултат като по-горе   -  person Murali    schedule 07.08.2019
comment
int value = s.charAt(i);. Вашият алгоритъм просто е грешен. Погледнете изходния код за правилния, прост алгоритъм.   -  person JB Nizet    schedule 07.08.2019
comment
Съжалявам, трябваше да поясня, че String str1 = "A"; е просто предложение за по-ясен и по-ефективен код, а не отговор за отстраняване на проблема ви.   -  person DodgyCodeException    schedule 07.08.2019


Отговори (1)


Така че отдалеч това, което виждам, правите грешка във функцията, какво имам предвид с това:

Math.pow((iv * 31), (str1.length() - 1 - i)) 

е равно => (65 * 31)^(1[str.lenght] - 1 - 0[i value])

какво дава нещо като (65*31) ^ 0 какво дава 1, но вие търсите израз 65 * (31 ^ 0) [в заключение], така че функцията трябва да изглежда така

Math.pow((31), (str1.length() - 1 - i)) * iv 

какво предполагам ще дам 65

person F0urth    schedule 07.08.2019