加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 存储位掩码的int值 – 提取1个值的位

发布时间:2020-12-15 04:52:34 所属栏目:Java 来源:网络整理
导读:我正在计算给定位集的int等价物并将其存储在内存中.从那里,我想确定原始位掩码中的所有1个值位.例: 33 – [1,6] 97 – [1,6,7] 在Java中实现的想法? 解决方法 在BitSet上 使用 java.util.BitSet 来存储一组位. 以下是如何根据int中的哪些位设置从int转换为
我正在计算给定位集的int等价物并将其存储在内存中.从那里,我想确定原始位掩码中的所有1个值位.例:

33 – > [1,6]
97 – > [1,6,7]

在Java中实现的想法?

解决方法

在BitSet上

使用java.util.BitSet来存储一组位.

以下是如何根据int中的哪些位设置从int转换为BitSet:

static BitSet fromInt(int num) {
    BitSet bs = new BitSet();
    for (int k = 0; k < Integer.SIZE; k++) {
        if (((num >> k) & 1) == 1) {
            bs.set(k);
        }
    }
    return bs;
}

所以现在你可以做到以下几点:

System.out.println(fromInt(33)); // prints "{0,5}"
System.out.println(fromInt(97)); // prints "{0,5,6}"

而为了完整性,这里是逆向转换:

static int toInt(BitSet bs) {
    int num = 0;
    for (int k = -1; (k = bs.nextSetBit(k + 1)) != -1; ) {
        num |= (1 << k);
    }
    return num;
}

因此,将两者组合在一起,我们总是得到原始数字:

System.out.println(toInt(fromInt(33))); // prints "33"
System.out.println(toInt(fromInt(97))); // prints "97"

基于0的索引

请注意,这使用了基于0的索引,这是更常用的位索引(以及Java中的大多数其他索引).这也更正确.在下面,^表示取幂:

33 = 2^0 + 2^5 = 1 + 32          97 = 2^0 + 2^5 + 2^6 = 1 + 32 + 64
33 -> {0,5}                     97 -> {0,6}

但是,如果您坚持使用基于1的索引,则可以使用bs.set(k 1); (1<(<(k-1))在上述片段中.不过,我会强烈反对这项建议. 相关问题
> What does the ^ operator do in Java? – 它实际上不是取幂

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读