如何用Go实现BitSet?

Ste*_*Hsu 11 go

我没有在Go中找到BitSet包,所以我尝试实现它.我想使用uint64数组来存储这些位.

我需要分配uint64数组的位数.使用Java,我可以定义一个带整数的构造函数.虽然Go不提供构造函数,但是当用户调用new()时如何正确初始化BitSet'对象'?

Las*_*ssi 11

Go 的标准big.Int可以用作位集:

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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

https://play.golang.org/p/xbIK-boouqC


小智 5

将 bitSet 声明为私有结构:

type bitSet struct {
  len int
  array []uint64
}
Run Code Online (Sandbox Code Playgroud)

暴露接口BitSet:

type BitSet interface {
  Has(pos int) bool
  Add(pos int) bool
  Len() int
}
Run Code Online (Sandbox Code Playgroud)

还公开一个函数 NewBitSet:

func NewBitSet(len int) BitSet {
  return &bitSet{len, make(uint64, (len+7) / 8) }
}
Run Code Online (Sandbox Code Playgroud)

这是 Go 的封装方式:共享接口,而不是实现。

  • 我不完全同意这个解决方案。我认为位集太具体而不能成为接口。它允许您拥有实现相同接口的不同位集,但您真的需要这样的东西吗?在我看来,您可能会想出一个位集实现,它几乎适用于任何用途,并且始终使用它。多种实现可能只会让人们感到困惑。 (6认同)