package main
import (
"fmt"
"math/big"
)
func main() {
var bits big.Int
for i := 1000; i < 2000; i++ {
bits.SetBit(&bits, i, 1)
}
for i := 0; i < 10000; i++ {
if bits.Bit(i) != 0 {
fmt.Println(i)
}
}
}
package bitset
const size = 64
type bits uint64
// BitSet is a set of bits that can be set, cleared and queried.
type BitSet []bits
// Set ensures that the given bit is set in the BitSet.
func (s *BitSet) Set(i uint) {
if len(*s) < int(i/size+1) {
r := make([]bits, i/size+1)
copy(r, *s)
*s = r
}
(*s)[i/size] |= 1 << (i % size)
}
// Clear ensures that the given bit is cleared (not set) in the BitSet.
func (s *BitSet) Clear(i uint) {
if len(*s) >= int(i/size+1) {
(*s)[i/size] &^= 1 << (i % size)
}
}
// IsSet returns true if the given bit is set, false if it is cleared.
func (s *BitSet) IsSet(i uint) bool {
return (*s)[i/size]&(1<<(i%size)) != 0
}
5条答案
按热度按时间9jyewag01#
Go语言的标准
big.Int
可以作为一个bit set:https://play.golang.org/p/xbIK-boouqC
vxf3dgd42#
将bitSet声明为私有结构:
暴露接口BitSet:
还公开了一个函数NewBitSet:
这是一个封装的Go方式:共享接口,而不是实现。
slmsl1lt3#
如果你使用[]uint64切片来存储数据,那么零切片可以用作空的BitSet。事实上,附加到nil切片会为你分配一个新的数组,尽管语言规范似乎并不保证这一点。通过这种设置,new(BitSet)将立即可用。示例:
bitset.go:
bitset_test.go:
m528fe3b4#
简单地说,当客户端调用
new
()时,您无法正确地初始化BitSet
对象。你能做的最好的事情就是使
BitSet
的零值有效。这就是像list.List
,sync.Mutex
和big.Int
这样的类型。这样你就知道客户端不可能得到无效的值。下一个最好的方法是创建一个类似构造器的函数(在本例中命名为
NewBitSet
),并期望客户端调用它。jgzswidk5#
我也实现了my own,这就是它的工作原理:
正如其他人回答的那样,有一个惯例是使用
New
函数来模拟构造函数。