From 789d0b498ad424a4f602d6082d764968be456ebe Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Tue, 21 Jun 2016 17:47:03 +0200 Subject: Add bitfield --- bitfield/bitfield.go | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 bitfield/bitfield.go (limited to 'bitfield/bitfield.go') diff --git a/bitfield/bitfield.go b/bitfield/bitfield.go new file mode 100644 index 0000000..2346a2c --- /dev/null +++ b/bitfield/bitfield.go @@ -0,0 +1,38 @@ +package bitfield + +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) { + panic("out of range") + } + return (int(b[x]>>y) & 1) == 1 +} + +func (b BitField) Set(i int) { + x := i / 8 + y := 7 - uint(i%8) + if x < 0 || x > len(b) { + panic("out of range") + } + b[x] |= 1 << y +} + +func (b BitField) Clear(i int) { + x := i / 8 + y := 7 - uint(i%8) + if x < 0 || x > len(b) { + panic("out of range") + } + b[x] &= ^(1 << y) +} -- cgit v1.2.3