github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/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 19:16:43</date> 10 //</624450113372164096> 11 12 13 package bitvector 14 15 import ( 16 "errors" 17 ) 18 19 var errInvalidLength = errors.New("invalid length") 20 21 type BitVector struct { 22 len int 23 b []byte 24 } 25 26 func New(l int) (bv *BitVector, err error) { 27 return NewFromBytes(make([]byte, l/8+1), l) 28 } 29 30 func NewFromBytes(b []byte, l int) (bv *BitVector, err error) { 31 if l <= 0 { 32 return nil, errInvalidLength 33 } 34 if len(b)*8 < l { 35 return nil, errInvalidLength 36 } 37 return &BitVector{ 38 len: l, 39 b: b, 40 }, nil 41 } 42 43 func (bv *BitVector) Get(i int) bool { 44 bi := i / 8 45 return bv.b[bi]&(0x1<<uint(i%8)) != 0 46 } 47 48 func (bv *BitVector) Set(i int, v bool) { 49 bi := i / 8 50 cv := bv.Get(i) 51 if cv != v { 52 bv.b[bi] ^= 0x1 << uint8(i%8) 53 } 54 } 55 56 func (bv *BitVector) Bytes() []byte { 57 return bv.b 58 } 59