Из документации 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());