Java шестнадцатеричный расчет - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть long значение bits, объявленное так:

long bits = len*8L; (304)

System.out.println(bits); Это выводит как 304

Если яиспользуйте биты длинных имен, как, таким образом, я получаю 0 и 0. соответственно.

System.out.println(bits>>(4*8));
System.out.println(0xFF&(bits>>(4*8)));

Если я использую фактическое число, например, я получаю 304 и 48 соответственно

System.out.println(304>>(4*8));
System.out.println(0xFF&(304>>(4*8)));

I 'Я пытаюсь конвертировать эту Java в JavaScript, но JavaScript дает мне 304 и 48 во всех сценариях.Мне нужно, чтобы он соответствовал Java и давал значения 0 и 0.

Любые идеи?

РЕДАКТИРОВАТЬ

Продолжайте, просто чтобы быть понятным, мне нужен эквивалент JavaScriptравным 0, имитируя то, как Java это делает в настоящее время (два примера выше, которые равны 0, не будут изменены в том, что мы разрабатываем).

Таким образом console.log (0xFF & (биты >> (4 * 8))) должен быть равен 0, в настоящее время он равен 48

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Если вы хотите получить тот же результат с константами в Java, что и с переменными, вам нужно передать 304 как длинную константу с 304L, например:

System.out.println(304L>>(4*8));
System.out.println(0xFF&(304L>>(4*8)));

Причина в том, что выне может сдвинуть int с 4 * 8 = 32 бита;Java сместит 32 по модулю 32 = ноль битов, поскольку int имеет длину всего 32 бита.

Javascript, в отличие от этого, не поддерживает смещение 64-битных целых чисел с помощью оператора >>;он обрабатывает каждое переданное вами число >> как 32-разрядное целое число.

Вы можете написать свою собственную функцию, которая выполняет нечто подобное:

function rshift(num, bits) {
    return Math.round(num / Math.pow(2,bits));
}

console.log(rshift(304, 4*8))
0 голосов
/ 14 ноября 2018

JLS , раздел 15.19 охватывает операторы смещения в Java.

Если тип левого операнда с расширенным порядком равен int, то только пять самых низкихбиты порядка правого операнда используются в качестве расстояния сдвига.Это как если бы правый операнд был обработан побитовым логическим оператором И & (§15.22.1) со значением маски 0x1f (0b11111).Следовательно, фактически используемое расстояние сдвига всегда находится в диапазоне от 0 до 31 включительно.

Для значения int, такого как 304, значение сдвига битов 4*8или 32, на самом деле 0, поэтому смещения не происходит.Тогда бит-и 0xFF дает 48.

Если тип левого операнда с расширенным типом равен long, то только шесть младших битов правого операндаручной операнд используется в качестве расстояния сдвига.Это как если бы правый операнд был обработан побитовым логическим оператором И & (§15.22.1) со значением маски 0x3f (0b111111).Поэтому фактически используемое расстояние сдвига всегда находится в диапазоне от 0 до 63 включительно.

Для значения long значение сдвига битов 4*8 действительно сдвигается вправые 32 бита, что приводит к 0.

Эта страница охватывает операторы битового сдвига JavaScript.

Битовые операторы обрабатывают свои операнды как последовательность из 32биты (нули и единицы), а не десятичные, шестнадцатеричные или восьмеричные числа.

Похоже, что JavaScript преобразует число в 32-битное число, как Java int.Похоже также, что то же правило «только 5 младших битов» применимо и к операнду сдвига в JavaScript.

console.log(304>>32);        // Don't shift!
console.log(0xFF&(304>>32)); // Don't shift!
console.log(304>>33);        // Shift by 1, not 33
console.log(0xFF&(304>>33)); // Shift by 1, not 33
...