首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >移动Java BitSet

移动Java BitSet
EN

Stack Overflow用户
提问于 2012-01-26 02:28:48
回答 8查看 11.3K关注 0票数 24

我使用java.util.BitSet来存储密集的位向量。

我想实现一个将位向右移位1的操作,类似于int上的>>>

有没有可以移动BitSets的库函数?

如果没有,有没有比下面更好的方法呢?

代码语言:javascript
复制
public static void logicalRightShift(BitSet bs) {
  for (int i = 0; (i = bs.nextSetBit(i)) >= 0;) {
    // i is the first bit in a run of set bits.

    // Set any bit to the left of the run.
    if (i != 0) { bs.set(i - 1); }

    // Now i is the index of the bit after the end of the run.
    i = bs.nextClearBit(i);  // nextClearBit never returns -1.
    // Clear the last bit of the run.
    bs.clear(i - 1);

    // 0000111100000...
    //     a   b
    // i starts off the loop at a, and ends the loop at b.
    // The mutations change the run to
    // 0001111000000...
  }
}
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-01-26 02:34:25

这应该能起到作用:

代码语言:javascript
复制
BitSet shifted = bs.get(1, bs.length());

它将给你一个与原始位集相等的位集,但没有最低的位。

编辑:

为了将其推广到n位,

代码语言:javascript
复制
BitSet shifted = bs.get(n, Math.max(n, bs.length()));
票数 23
EN

Stack Overflow用户

发布于 2012-01-26 02:32:42

另一种可能更有效的方法是使用底层的long[]。

使用bitset.toLongArray()获取底层数据。相应地移位这些长整型,然后通过BitSet.valueOf(long[])创建一个新的BitSet你必须非常小心地移位底层的长整型,因为你必须将低位移位到数组中下一个长整型的高位。

这应该允许您使用处理器上原生的位移位操作来一次移动64位,而不是分别迭代每个位。

编辑:基于路易斯·沃瑟曼的评论。这只在Java 1.7 API中可用。我写的时候没有意识到这一点。

票数 7
EN

Stack Overflow用户

发布于 2012-08-02 22:26:26

请找到BitSet被“左移”的代码块

代码语言:javascript
复制
/**
 * Shift the BitSet to left.<br>
 * For example : 0b10010 (=18) => 0b100100 (=36) (equivalent to multiplicate by 2)
 * @param bitSet
 * @return shifted bitSet
 */
public static BitSet leftShiftBitSet(BitSet bitSet) {
    final long maskOfCarry = 0x8000000000000000L;
    long[] aLong = bitSet.toLongArray();

    boolean carry = false;
    for (int i = 0; i < aLong.length; ++i) {
        if (carry) {
            carry = ((aLong[i] & maskOfCarry) != 0);
            aLong[i] <<= 1;
            ++aLong[i];
        } else {
            carry = ((aLong[i] & maskOfCarry) != 0);
            aLong[i] <<= 1;
        }
    }

    if (carry) {
        long[] tmp = new long[aLong.length + 1];
        System.arraycopy(aLong, 0, tmp, 0, aLong.length);
        ++tmp[aLong.length];
        aLong = tmp;
    }

    return BitSet.valueOf(aLong);
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9008150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档