From 7e61872f4662d7c2ce78a8d28444ef608e253c30 Mon Sep 17 00:00:00 2001 From: Tnze Date: Sun, 4 Apr 2021 11:36:56 +0800 Subject: [PATCH] opt bitstorage --- save/bitstorage.go | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/save/bitstorage.go b/save/bitstorage.go index d6de313..53ec03d 100644 --- a/save/bitstorage.go +++ b/save/bitstorage.go @@ -49,9 +49,10 @@ func (i initBitStorageErr) Error() string { return fmt.Sprintf("invalid length given for storage, got: %d but expected: %d", i.ArrlLen, i.WantLen) } -func (b *BitStorage) cellIndex(n int) int { - elemPerLong := 64 / b.bits - return n / elemPerLong +func (b *BitStorage) calcIndex(n int) (c, o int) { + c = n / b.valuesPerLong + o = (n - c*b.valuesPerLong) * b.bits + return } // Swap sets v into [i], and return the previous [i] value. @@ -60,9 +61,8 @@ func (b *BitStorage) Swap(i, v int) (old int) { v < 0 || uint64(v) > b.mask { panic("out of bounds") } - c := b.cellIndex(i) + c, offset := b.calcIndex(i) l := b.data[c] - offset := uint64((i - c*b.valuesPerLong) * b.bits) old = int(l >> offset & b.mask) b.data[c] = l&(b.mask< b.mask { panic("out of bounds") } - c := b.cellIndex(i) + c, offset := b.calcIndex(i) l := b.data[c] - offset := (i - c*b.valuesPerLong) * b.bits b.data[c] = l&(b.mask< b.size-1 { panic("out of bounds") } - c := b.cellIndex(i) + c, offset := b.calcIndex(i) l := b.data[c] - offset := (i - c*b.valuesPerLong) * b.bits return int(l >> offset & b.mask) }