Go语言 将位Map到int

fdx2calv  于 2023-04-03  发布在  Go
关注(0)|答案(2)|浏览(118)

我正在尝试将一个uint64数组的位Map到一个int数组(见下文)。BitSet 是一个[]uint64。下面是我当前设置的代码。但是我想知道golang中是否有一个std函数可以减少这个代码。其他语言有BitArray或其他对象,使生活变得更容易。
那么,在Golang中,我们必须编码吗?有更好的方法吗?

// Indexes the index positions of '1' bits as an int array
func (b BitSet) Indexes() []int {
    // set up masks for bit ANDing
    masks := make([]uint64, _BitsPerUint64)
    for i := 0; i < _BitsPerUint64; i++ {
        masks[i] = (1 << uint(i))
    }
    // iterate bitset
    indexes := make([]int, 0, len(b)*4)
    for i := 0; i < len(b); i++ {
        for m := 0; m < _BitsPerUint64; m++ {
            if masks[m]&b[i] > 0 {
                indexes = append(indexes, i*_BitsPerUint64+m)
            }
        }
    }
    return indexes
}
5anewei6

5anewei61#

func (b BitSet) Indexes() []int {
    retval := make([]int, 0, len(b)*64)
    for idx, value := range b {
        for i := 0; i < 64; i++ {
            if value & (1<<uint(i)) != 0 {
                retval = append(retval, idx*64 + i)
            }
        }
    }
    return retval
}
r1zhe5dt

r1zhe5dt2#

下面是我如何使用bitmask package(我是作者):

// returns indexes of all set bits in a bitmask
func indexes(bm *BitMask) []int {
    indexes := make([]int, 0, bm.len)
    it := bm.Iterator()
    for {
        ok, isSet, index := it.Next()
        if !ok {
            break
        }
        // use the value
        if isSet {
            indexes = append(indexes, int(index))
        }
    }
    return indexes
}

相关问题