Skip to content

Commit e60a551

Browse files
committed
kiss
1 parent 147fcdb commit e60a551

File tree

3 files changed

+30
-37
lines changed

3 files changed

+30
-37
lines changed

bit.go

Lines changed: 19 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,40 +4,31 @@ package bit
44
// Field is a variable-length bit-field
55
type Field []byte
66

7-
// IsSet checks if bit n is set
8-
func (bf *Field) IsSet(n int) bool {
9-
bit, off := n>>3, byte(1<<uint(n&7))
10-
if len(*bf) <= bit {
11-
return false
7+
// Set bit
8+
func (f *Field) Set(k int) {
9+
n, m := k>>3, byte(1<<uint(k&7))
10+
if len(*f) <= n {
11+
*f = append(*f, make([]byte, n-len(*f)+1)...)
1212
}
13-
return (*bf)[bit]&off != 0
13+
(*f)[n] |= m
1414
}
1515

16-
// Set bit n
17-
func (bf *Field) Set(n int) *Field {
18-
bit, off := n>>3, byte(1<<uint(n&7))
19-
if len(*bf) <= bit {
20-
*bf = append(*bf, make([]byte, bit-len(*bf)+1)...)
21-
}
22-
(*bf)[bit] |= off
23-
return bf
16+
// IsSet checks if bit is set
17+
func (f *Field) IsSet(k int) bool {
18+
n, m := k>>3, byte(1<<uint(k&7))
19+
return len(*f) > n && (*f)[n]&m != 0
2420
}
2521

26-
// IsClear checks if bit n is cleared
27-
func (bf *Field) IsClear(n int) bool {
28-
bit, off := n>>3, byte(1<<uint(n&7))
29-
if len(*bf) <= bit {
30-
return true
22+
// Clear bit
23+
func (f *Field) Clear(k int) {
24+
n, m := k>>3, byte(1<<uint(k&7))
25+
if len(*f) > n {
26+
(*f)[n] &^= m
3127
}
32-
return (*bf)[bit]&off == 0
3328
}
3429

35-
// Clear bit n
36-
func (bf *Field) Clear(n int) *Field {
37-
bit, off := n>>3, byte(1<<uint(n&7))
38-
if len(*bf) <= bit {
39-
return bf
40-
}
41-
(*bf)[bit] &^= off
42-
return bf
30+
// IsClear checks if bit is cleared
31+
func (f *Field) IsClear(k int) bool {
32+
n, m := k>>3, byte(1<<uint(k&7))
33+
return len(*f) <= n || (*f)[n]&m == 0
4334
}

bit_test.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,17 @@ import "testing"
44

55
func TestBit(t *testing.T) {
66
bf := new(Field)
7-
for i := 0; i < 64; i++ {
8-
if bf.IsSet(i) || !bf.IsClear(i) {
9-
t.Error("got set, want clear")
7+
for k := 0; k < 64; k++ {
8+
if bf.IsSet(k) || !bf.IsClear(k) {
9+
t.Error("got set, want clear", k)
1010
}
11-
bf.Clear(i)
12-
if bf.IsSet(i) || !bf.IsClear(i) {
13-
t.Error("got set, want clear")
11+
bf.Clear(k)
12+
if bf.IsSet(k) || !bf.IsClear(k) {
13+
t.Error("got set, want clear", k)
1414
}
15-
bf.Set(i)
16-
if bf.IsClear(i) || !bf.IsSet(i) {
17-
t.Error("got clear, want set")
15+
bf.Set(k)
16+
if bf.IsClear(k) || !bf.IsSet(k) {
17+
t.Error("got clear, want set", k)
1818
}
1919
}
2020
}

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
module dim13.org/bit
2+
3+
go 1.17

0 commit comments

Comments
 (0)