将位映射到int

时间:2019-01-24 05:01:05

标签: go

我正在尝试将uint64数组的位位置映射到一个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
}

1 个答案:

答案 0 :(得分:2)

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
}