int160.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package int160
  2. import (
  3. "encoding/hex"
  4. "math"
  5. "math/big"
  6. )
  7. type T struct {
  8. bits [20]uint8
  9. }
  10. func (me T) String() string {
  11. return hex.EncodeToString(me.bits[:])
  12. }
  13. func (me *T) AsByteArray() [20]byte {
  14. return me.bits
  15. }
  16. func (me *T) ByteString() string {
  17. return string(me.bits[:])
  18. }
  19. func (me *T) BitLen() int {
  20. var a big.Int
  21. a.SetBytes(me.bits[:])
  22. return a.BitLen()
  23. }
  24. func (me *T) SetBytes(b []byte) {
  25. n := copy(me.bits[:], b)
  26. if n != 20 {
  27. panic(n)
  28. }
  29. }
  30. func (me *T) SetBit(index int, val bool) {
  31. var orVal uint8
  32. if val {
  33. orVal = 1 << (7 - index%8)
  34. }
  35. var mask uint8 = ^(1 << (7 - index%8))
  36. me.bits[index/8] = me.bits[index/8]&mask | orVal
  37. }
  38. func (me *T) GetBit(index int) bool {
  39. return me.bits[index/8]>>(7-index%8)&1 == 1
  40. }
  41. func (me T) Bytes() []byte {
  42. return me.bits[:]
  43. }
  44. func (l T) Cmp(r T) int {
  45. for i := range l.bits {
  46. if l.bits[i] < r.bits[i] {
  47. return -1
  48. } else if l.bits[i] > r.bits[i] {
  49. return 1
  50. }
  51. }
  52. return 0
  53. }
  54. func (me *T) SetMax() {
  55. for i := range me.bits {
  56. me.bits[i] = math.MaxUint8
  57. }
  58. }
  59. func (me *T) Xor(a, b *T) {
  60. for i := range me.bits {
  61. me.bits[i] = a.bits[i] ^ b.bits[i]
  62. }
  63. }
  64. func (me *T) IsZero() bool {
  65. for _, b := range me.bits {
  66. if b != 0 {
  67. return false
  68. }
  69. }
  70. return true
  71. }
  72. func FromBytes(b []byte) (ret T) {
  73. ret.SetBytes(b)
  74. return
  75. }
  76. func FromByteArray(b [20]byte) (ret T) {
  77. ret.SetBytes(b[:])
  78. return
  79. }
  80. func FromByteString(s string) (ret T) {
  81. ret.SetBytes([]byte(s))
  82. return
  83. }
  84. func Distance(a, b T) (ret T) {
  85. ret.Xor(&a, &b)
  86. return
  87. }
  88. func (a T) Distance(b T) (ret T) {
  89. ret.Xor(&a, &b)
  90. return
  91. }