public static Int128 Rol(Int128 a, int amt) { int nn; Int128 aa = a.Clone(); for (; amt > 0; amt--) { for (nn = 0; nn < 4; nn++) { aa.digits[nn] <<= 1; } for (nn = 0; nn < 3; nn++) { if (aa.digits[nn] > 0xffffffffL) { aa.digits[nn] &= 0xffffffffL; aa.digits[nn + 1]++; } } if (aa.digits[nn] > 0xffffffffL) { aa.digits[0] |= 1; } aa.digits[nn] &= 0xffffffffL; } aa.mask(); return(aa); }
public static Int128 Xor(Int128 a, Int128 b) { int nn; Int128 sum = new Int128(); for (nn = 0; nn < 4; nn++) { sum.digits[nn] = a.digits[nn] ^ b.digits[nn]; } sum.mask(); return(sum); }
public Int128 FromHexString(string str) { Int128 a = new Int128(); int nn; for (nn = 0; nn < str.Length; nn++) { a = Shl(a, 4); a.digits[0] |= System.Convert.ToUInt64(str.Substring(nn, 1), 16); } a.mask(); return(a); }
public Int128 Clone() { int nn; Int128 c; c = new Int128(); for (nn = 0; nn < 4; nn++) { c.digits[nn] = this.digits[nn]; } c.mask(); return(c); }
public static Int128 Sub(Int128 a, Int128 b) { int nn; Int128 dif = new Int128(); for (nn = 0; nn < 4; nn++) { dif.digits[nn] = a.digits[nn] - b.digits[nn]; } for (nn = 0; nn < 3; nn++) { if (dif.digits[nn] < 0L) { dif.digits[nn] &= 0xffffffffL; dif.digits[nn + 1]--; } } dif.mask(); return(dif); }
public static Int128 Add(Int128 a, Int128 b) { int nn; Int128 sum = new Int128(); for (nn = 0; nn < 4; nn++) { sum.digits[nn] = a.digits[nn] + b.digits[nn]; } for (nn = 0; nn < 3; nn++) { if (sum.digits[nn] > 0xffffffffL) { sum.digits[nn] &= 0xffffffffL; sum.digits[nn + 1]++; } } sum.mask(); return(sum); }
public Int128 ShrPair(Int128 hi, Int128 lo, int amt) { int nn; UInt64[] digits; Int128 aa = new Int128(); digits = new ulong[8]; Int128 reslo = lo.Clone(); Int128 reshi = hi.Clone(); digits[0] = lo.digits[0]; digits[1] = lo.digits[1]; digits[2] = lo.digits[2]; digits[3] = lo.digits[3]; digits[4] = hi.digits[0]; digits[5] = hi.digits[1]; digits[6] = hi.digits[2]; digits[7] = hi.digits[3]; for (; amt > 0; amt--) { for (nn = 7; nn > 0; nn--) { if ((digits[nn] & 1L) != 0) { digits[nn - 1] |= 0x100000000L; } } for (nn = 0; nn < 8; nn++) { digits[nn] >>= 1; } } aa.digits[0] = digits[0]; aa.digits[1] = digits[1]; aa.digits[2] = digits[2]; aa.digits[3] = digits[3]; aa.mask(); return(aa); }
public static Int128 Asr(Int128 a, int amt) { int nn; Int128 aa = a.Clone(); for (; amt > 0; amt--) { for (nn = 3; nn > 0; nn--) { if ((aa.digits[nn] & 1L) != 0) { aa.digits[nn - 1] |= 0x100000000L; } } for (nn = 0; nn < 4; nn++) { aa.digits[nn] >>= 1; } aa.digits[nn - 1] |= (ulong)((aa.digits[nn - 1] >> 30) & 1) << 31; } aa.mask(); return(aa); }
public static void ShlPair(Int128 a, ref Int128 aa, ref Int128 bb, int amt, int lsb = 0) { int nn; aa = a.Clone(); // bb = Int128.Convert(lsb!=0 ? -1 : 0); for (; amt > 0; amt--) { for (nn = 0; nn < 4; nn++) { aa.digits[nn] <<= 1; bb.digits[nn] <<= 1; } for (nn = 0; nn < 3; nn++) { if (aa.digits[nn] > 0xffffffffL) { aa.digits[nn] &= 0xffffffffL; aa.digits[nn + 1]++; } if (bb.digits[nn] > 0xffffffffL) { bb.digits[nn] &= 0xffffffffL; bb.digits[nn + 1]++; } } if (aa.digits[nn] > 0xffffffffL) { bb.digits[0]++; } aa.digits[0] |= (ulong)lsb; aa.mask(); bb.mask(); } }