Вывод XOR неверен в Javascript - PullRequest
0 голосов
/ 14 июля 2020

Выполняю следующую операцию

let a = 596873718249029632;
a ^= 454825669;
console.log(a);

Вывод: 454825669 , но на выходе должно было быть 596873718703855301 . Где я делаю не так? Что мне нужно сделать, чтобы получить 596873718703855301 в качестве вывода?

РЕДАКТИРОВАТЬ: Я использую nodejs библиотеку Bigint, моя версия узла - 8.12.0

var bigInt = require("big-integer");

let xor = bigInt(596873718249029632).xor(454825669);
console.log(xor)

Вывод это

{ [Number: 596873717794203900]
  value: [ 4203941, 7371779, 5968 ],
  sign: false,
  isSmall: false } 

Это неправильно. это должно было быть 596873718703855301 .

1 Ответ

3 голосов
/ 14 июля 2020

Из документации MDN по XOR :

Операнды преобразуются в 32-битные целые числа и выражаются серией битов (нулей и единиц). Числа с более чем 32 битами отбрасывают старшие значащие биты.

Поскольку 32 младших значащих бита 596873718249029632 все равны 0, то значение a фактически равно 0 ^ 454825669, что равно 454825669.

Чтобы получить предполагаемое значение 596873718703855301, можно использовать BigInts , что позволяет выполнять операции за пределами диапазона примитива Number, поэтому теперь ваш код станет:

let a = 596873718249029632n;
a ^= 454825669n;

console.log(a.toString());

В ответ на ваше изменение, при работе с целыми числами и Number, вам необходимо убедиться, что ваши значения не превышают Number.MAX_SAFE_INTEGER (равно 2 53 - 1, за пределами этой точки числа с плавающей запятой двойной точности теряют точность, достаточную для представления целых чисел). У меня сработал следующий фрагмент:

var big_int = require("big-integer");
let xor = bigInt("596873718249029632").xor("454825669");
console.log(xor.toString());
...