github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/swarm/network/bitvector/bitvector.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 12:09:47</date> 10 //</624342671938293760> 11 12 // 13 // 14 // 15 // 16 // 17 // 18 // 19 // 20 // 21 // 22 // 23 // 24 // 25 // 26 // 27 28 package bitvector 29 30 import ( 31 "errors" 32 ) 33 34 var errInvalidLength = errors.New("invalid length") 35 36 type BitVector struct { 37 len int 38 b []byte 39 } 40 41 func New(l int) (bv *BitVector, err error) { 42 return NewFromBytes(make([]byte, l/8+1), l) 43 } 44 45 func NewFromBytes(b []byte, l int) (bv *BitVector, err error) { 46 if l <= 0 { 47 return nil, errInvalidLength 48 } 49 if len(b)*8 < l { 50 return nil, errInvalidLength 51 } 52 return &BitVector{ 53 len: l, 54 b: b, 55 }, nil 56 } 57 58 func (bv *BitVector) Get(i int) bool { 59 bi := i / 8 60 return bv.b[bi]&(0x1<<uint(i%8)) != 0 61 } 62 63 func (bv *BitVector) Set(i int, v bool) { 64 bi := i / 8 65 cv := bv.Get(i) 66 if cv != v { 67 bv.b[bi] ^= 0x1 << uint8(i%8) 68 } 69 } 70 71 func (bv *BitVector) Bytes() []byte { 72 return bv.b 73 } 74 75 func (bv *BitVector) Length() int { 76 return bv.len 77 } 78