Чем отличается побитовая работа между javascript и java - PullRequest
1 голос
/ 10 ноября 2019

Я делаю некоторые преобразования кода из JavaScript в Java. При запуске процесса какой-то побитовой операции, я обнаружил, что поведение побитовой операции между javascript и java настолько разное. Я относительно опытен в JVM, мне кажется, что операция нормальная. Но в части JavaScript, я немного запутался. Я проверил MDN на mozilla , приведенная демонстрация кажется мне нормальной, но я обнаружил, что дело не так, как ожидалось.

Вопрос:

  1. Не могли бы вы объяснить, почему побитовая операция и код, который я прикрепил, так различны в javascript и java?

  2. Кроме того, я знаю, что моих знаний в javascript недостаточно для выполнения какого-либо преобразования кода между этими двумя языками, есть ли полезный сайт, который помогает мне лучше пониматьна побитовую операцию или структуру данных числовых данных в JavaScript?

Java-код

        Long x = 4023233417L;
        System.out.println(String.format("%d => %s",x, Long.toBinaryString(x)));
        Long y = 2562383102L;
        System.out.println(String.format("%d => %s",y, Long.toBinaryString(y)));
        Long result = x & y;
        System.out.println(String.format("%d => %s",result, Long.toBinaryString(result)));

        //Output
        //4023233417 => 11101111110011011010101110001001
        //2562383102 => 10011000101110101101110011111110
        //2290649224 => 10001000100010001000100010001000

Javascript code

x= 4023233417
console.log(x.toString(2))
y = 2562383102
console.log(y.toString(2))
result = x & y
console.log(result.toString(2))
//Output
//11101111110011011010101110001001
//10011000101110101101110011111110
//-1110111011101110111011101111000

Я ожидаю, что x & y должен "10001000100010001000100010001000".

Но в коде JavaScript, результат: «-1110111011101110111011101111000»

1 Ответ

1 голос
/ 10 ноября 2019

В javascript вы можете выполнять побитовые операции только с 32-битными числами. Даже javascript использует стандарт IEEE 754 с плавающей точкой для представления числа. Побитовая операция может быть выполнена с 32-битным числом. Следовательно, остальные биты будут игнорироваться.

Чтобы преобразовать любое число в его 32-битное представление, number | 0 вместе с ним. Когда javascript читает x & y, он считает 32-битные x и y и игнорирует другие биты в молчании. В вашем случае числа, по которым вы выполняете битовую обработку, равны x = -271733879 и y = -1732584194.

Безопасный диапазон для битовой операции в Javascript составляет от Math.pow(-2,31) (-2147483648, около -2,1 миллиарда) до Math.pow(2,32)-1 (2147483647, около +2,1 млрд).

x= 4023233417;
console.log(x.toString(2))
y = 2562383102 ;
console.log(y.toString(2));

result = x & y;

console.log(result.toString(2)); //-1110111011101110111011101111000

x = x | 0; //-271733879
y = y | 0; //-1732584194
console.log("32 bit x: " + x);
console.log("32 bit y: " + y);
result = x & y;

console.log(result.toString(2)); //-1110111011101110111011101111000
...