aboutsummaryrefslogtreecommitdiff
path: root/bitfield
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-06-21 17:47:03 +0200
committerDimitri Sokolyuk <demon@dim13.org>2016-06-21 17:47:03 +0200
commit789d0b498ad424a4f602d6082d764968be456ebe (patch)
treed504b539c8d9aa9daadc4fab1d059856862d0453 /bitfield
parentcd2403a825a9dc8273f8ce920b805c0938fbb82b (diff)
Add bitfield
Diffstat (limited to 'bitfield')
-rw-r--r--bitfield/bitfield.go38
-rw-r--r--bitfield/bitfield_test.go16
2 files changed, 54 insertions, 0 deletions
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)
+}
diff --git a/bitfield/bitfield_test.go b/bitfield/bitfield_test.go
new file mode 100644
index 0000000..4b7218a
--- /dev/null
+++ b/bitfield/bitfield_test.go
@@ -0,0 +1,16 @@
+package bitfield
+
+import "testing"
+
+func TestNew(t *testing.T) {
+ bf := New(63)
+ bf.Set(7)
+ if !bf.At(7) {
+ t.Error("expected set")
+ }
+ bf.Clear(7)
+ if bf.At(7) {
+ t.Error("expected cleared")
+ }
+ t.Log("len:", len(bf), bf, bf.At(7))
+}