From 7778760145f5add9aeb4bf3ca1421286337e2c56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Fri, 30 Sep 2022 23:23:23 +0800 Subject: [PATCH] finish uint128be --- uint128be.go | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/uint128be.go b/uint128be.go index 2efcdb4..4f25bd3 100644 --- a/uint128be.go +++ b/uint128be.go @@ -1,6 +1,44 @@ package unibase2n -type usgnint128 struct { +import ( + "encoding/binary" + "math/bits" +) + +type uint128be struct { a uint64 b uint64 } + +func readuint128be(b []byte) *uint128be { + return &uint128be{ + a: binary.BigEndian.Uint64(b[:8]), + b: binary.BigEndian.Uint64(b[8:16]), + } +} + +func (num *uint128be) add(n *uint128be) { + var c uint64 + num.b, c = bits.Add64(num.b, n.b, 0) + num.a, _ = bits.Add64(num.a, n.a, c) + return +} + +// shr only supports shifting 1 ~ 63 bits +func (num *uint128be) shr(c uint8) { + mask := uint64(1)<> c + num.b = aout | (num.b >> c) +} + +func (num *uint128be) and(n *uint128be) { + num.a &= n.a + num.b &= n.b +} + +func (num *uint128be) write(b []byte) { + binary.BigEndian.PutUint64(b[:8], num.a) + binary.BigEndian.PutUint64(b[8:16], num.b) + return +}