Пример #1
0
        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));
        }
Пример #2
0
        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));
        }
Пример #3
0
 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)));
 }
Пример #4
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));
        }