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