github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/swarm/network/bitvector/bitvector.go (about) 1 2 //此源码被清华学神尹成大魔王专业翻译分析并修改 3 //尹成QQ77025077 4 //尹成微信18510341407 5 //尹成所在QQ群721929980 6 //尹成邮箱 yinc13@mails.tsinghua.edu.cn 7 //尹成毕业于清华大学,微软区块链领域全球最有价值专家 8 //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620 9 // 10 // 11 // 12 // 13 // 14 // 15 // 16 // 17 // 18 // 19 // 20 // 21 // 22 // 23 // 24 25 package bitvector 26 27 import ( 28 "errors" 29 ) 30 31 var errInvalidLength = errors.New("invalid length") 32 33 type BitVector struct { 34 len int 35 b []byte 36 } 37 38 func New(l int) (bv *BitVector, err error) { 39 return NewFromBytes(make([]byte, l/8+1), l) 40 } 41 42 func NewFromBytes(b []byte, l int) (bv *BitVector, err error) { 43 if l <= 0 { 44 return nil, errInvalidLength 45 } 46 if len(b)*8 < l { 47 return nil, errInvalidLength 48 } 49 return &BitVector{ 50 len: l, 51 b: b, 52 }, nil 53 } 54 55 func (bv *BitVector) Get(i int) bool { 56 bi := i / 8 57 return bv.b[bi]&(0x1<<uint(i%8)) != 0 58 } 59 60 func (bv *BitVector) Set(i int, v bool) { 61 bi := i / 8 62 cv := bv.Get(i) 63 if cv != v { 64 bv.b[bi] ^= 0x1 << uint8(i%8) 65 } 66 } 67 68 func (bv *BitVector) Bytes() []byte { 69 return bv.b 70 } 71 72 func (bv *BitVector) Length() int { 73 return bv.len 74 }