diff options
author | Martin Holst Swende <martin@swende.se> | 2017-05-29 05:39:33 +0800 |
---|---|---|
committer | Martin Holst Swende <martin@swende.se> | 2017-06-05 14:44:11 +0800 |
commit | 3285a0fda37207ca1b79ac28e2c12c6f5efff89b (patch) | |
tree | f17d74593a9ed24dd99bf94a48d5ddeaff2e41c6 /common/math/big.go | |
parent | 6171d01b1195abd7ac75044dcd507d4758d83cde (diff) | |
download | dexon-3285a0fda37207ca1b79ac28e2c12c6f5efff89b.tar dexon-3285a0fda37207ca1b79ac28e2c12c6f5efff89b.tar.gz dexon-3285a0fda37207ca1b79ac28e2c12c6f5efff89b.tar.bz2 dexon-3285a0fda37207ca1b79ac28e2c12c6f5efff89b.tar.lz dexon-3285a0fda37207ca1b79ac28e2c12c6f5efff89b.tar.xz dexon-3285a0fda37207ca1b79ac28e2c12c6f5efff89b.tar.zst dexon-3285a0fda37207ca1b79ac28e2c12c6f5efff89b.zip |
core/vm, common/math: Add fast getByte for bigints, improve opByte
Diffstat (limited to 'common/math/big.go')
-rw-r--r-- | common/math/big.go | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/common/math/big.go b/common/math/big.go index fd0174b36..48ad90216 100644 --- a/common/math/big.go +++ b/common/math/big.go @@ -130,6 +130,34 @@ func PaddedBigBytes(bigint *big.Int, n int) []byte { return ret } +// LittleEndianByteAt returns the byte at position n, +// if bigint is considered little-endian. +// So n==0 gives the least significant byte +func LittleEndianByteAt(bigint *big.Int, n int) byte { + words := bigint.Bits() + // Check word-bucket the byte will reside in + i := n / wordBytes + if i >= len(words) { + return byte(0) + } + word := words[i] + // Offset of the byte + shift := 8 * uint(n%wordBytes) + + return byte(word >> shift) +} + +// BigEndian32ByteAt returns the byte at position n, +// if bigint is considered big-endian. +// So n==0 gives the most significant byte +// WARNING: Only works for bigints in 32-byte range +func BigEndian32ByteAt(bigint *big.Int, n int) byte { + if n > 31 { + return byte(0) + } + return LittleEndianByteAt(bigint, 31-n) +} + // ReadBits encodes the absolute value of bigint as big-endian bytes. Callers must ensure // that buf has enough space. If buf is too short the result will be incomplete. func ReadBits(bigint *big.Int, buf []byte) { |