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