public static EcmaValue ToBigUIntN(EcmaValue value, int bits) { value = value.ToBigInt(); if (bits <= 0) { return(value0n); } if (bits == 64) { return(ToBigUInt64(value)); } if (EcmaValue.GetNumberCoercion(value) == EcmaNumberType.BigInt64) { if (bits > 64) { return(ToBigInt(unchecked ((ulong)value.ToInt64()))); } long v = value.ToInt64(); long mask = (1 << bits) - 1; return(ToBigInt(unchecked ((ulong)(v & mask)))); } BigInteger u = ToBigInteger(value); BigInteger bitsm0 = BigInteger.Pow(2, bits); BigInteger rem = BigInteger.Remainder(u, bitsm0); return(ToBigInt(rem < 0 ? rem + bitsm0 : rem)); }
public static EcmaValue ToBigIntN(EcmaValue value, int bits) { value = value.ToBigInt(); if (bits <= 0) { return(value0n); } if (bits == 64) { return(ToBigInt64(value)); } if (EcmaValue.GetNumberCoercion(value) == EcmaNumberType.BigInt64) { if (bits > 64) { return(value); } long r = 1 << bits; long m = 1 << (bits - 1); long v = value.ToInt64() % r; return(ToBigInt(v < -m ? v + r : v >= m ? v - r : v)); } BigInteger u = ToBigInteger(value); BigInteger bitsm0 = BigInteger.Pow(2, bits); BigInteger bitsm1 = BigInteger.Pow(2, bits - 1); BigInteger rem = BigInteger.Remainder(u, bitsm0); return(ToBigInt(rem < -bitsm1 ? rem + bitsm1 : rem >= bitsm1 ? rem - bitsm0 : rem)); }
public static EcmaValue ToBigInt64(this EcmaValue value) { value = value.ToBigInt(); if (EcmaValue.GetNumberCoercion(value) == EcmaNumberType.BigInt64) { return(value); } byte[] byteArray = ((BigInteger)value.GetUnderlyingObject()).ToByteArray(); return(ToBigInt(BitConverter.ToInt64(byteArray, 0))); }
public static EcmaValue ToBigUInt64(this EcmaValue value) { value = value.ToBigInt(); if (EcmaValue.GetNumberCoercion(value) == EcmaNumberType.BigInt64) { long v = value.ToInt64(); return(v >= mod63?ToBigInt(new BigInteger(unchecked ((ulong)v))) : value); } BigInteger rem = BigInteger.Remainder((BigInteger)value.GetUnderlyingObject(), mod64); return(ToBigInt(rem < 0 ? rem + mod64 : rem)); }