123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- '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;
- */
- };
|