You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
1.7 KiB
66 lines
1.7 KiB
'use strict'; |
|
|
|
var GetIntrinsic = require('get-intrinsic'); |
|
|
|
var $TypeError = GetIntrinsic('%TypeError%'); |
|
// var $BigInt = GetIntrinsic('%BigInt%', true); |
|
// var $pow = GetIntrinsic('%Math.pow%'); |
|
|
|
// var BinaryAnd = require('./BinaryAnd'); |
|
// var BinaryOr = require('./BinaryOr'); |
|
// var BinaryXor = require('./BinaryXor'); |
|
var Type = require('./Type'); |
|
// var modulo = require('./modulo'); |
|
|
|
// var zero = $BigInt && $BigInt(0); |
|
// var negOne = $BigInt && $BigInt(-1); |
|
// var two = $BigInt && $BigInt(2); |
|
|
|
// https://262.ecma-international.org/11.0/#sec-bigintbitwiseop |
|
|
|
module.exports = function BigIntBitwiseOp(op, x, y) { |
|
if (op !== '&' && op !== '|' && op !== '^') { |
|
throw new $TypeError('Assertion failed: `op` must be `&`, `|`, or `^`'); |
|
} |
|
if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') { |
|
throw new $TypeError('`x` and `y` must be BigInts'); |
|
} |
|
|
|
if (op === '&') { |
|
return x & y; |
|
} |
|
if (op === '|') { |
|
return x | y; |
|
} |
|
return x ^ y; |
|
/* |
|
var result = zero; |
|
var shift = 0; |
|
while (x !== zero && x !== negOne && y !== zero && y !== negOne) { |
|
var xDigit = modulo(x, two); |
|
var yDigit = modulo(y, two); |
|
if (op === '&') { |
|
result += $pow(2, shift) * BinaryAnd(xDigit, yDigit); |
|
} else if (op === '|') { |
|
result += $pow(2, shift) * BinaryOr(xDigit, yDigit); |
|
} else if (op === '^') { |
|
result += $pow(2, shift) * BinaryXor(xDigit, yDigit); |
|
} |
|
shift += 1; |
|
x = (x - xDigit) / two; |
|
y = (y - yDigit) / two; |
|
} |
|
var tmp; |
|
if (op === '&') { |
|
tmp = BinaryAnd(modulo(x, two), modulo(y, two)); |
|
} else if (op === '|') { |
|
tmp = BinaryAnd(modulo(x, two), modulo(y, two)); |
|
} else { |
|
tmp = BinaryXor(modulo(x, two), modulo(y, two)); |
|
} |
|
if (tmp !== 0) { |
|
result -= $pow(2, shift); |
|
} |
|
return result; |
|
*/ |
|
};
|
|
|