package bitfield import "fmt" type BitField []byte func New(n int) BitField { l := n / 8 if pad := (8 - n%8) % 8; pad != 0 { l++ } return make(BitField, l) } func (b BitField) At(i int) bool { x := i / 8 y := 7 - uint(i%8) if x >= 0 && x < len(b) { return (int(b[x]>>y) & 1) == 1 } return false } func (b BitField) Set(i int) { x := i / 8 y := 7 - uint(i%8) if x >= 0 && x < len(b) { b[x] |= 1 << y } } func (b BitField) Clear(i int) { x := i / 8 y := 7 - uint(i%8) if x >= 0 && x < len(b) { b[x] &= ^(1 << y) } } func (b BitField) String() string { return fmt.Sprintf("% x", []byte(b)) }