【问题标题】:Convert a byte or int to bitset将字节或整数转换为位集
【发布时间】:2012-08-02 23:00:58
【问题描述】:

我有以下几点:

int num=Integer.parseInt(lineArray[0]);
byte numBit= num & 0xFF;

有什么非常简单的方法可以将numBit 转换为位数组?或者更好的是,有没有办法绕过int的字节转换,直接从num变成位数组?

谢谢

【问题讨论】:

标签: java type-conversion bitarray


【解决方案1】:

只是一个使用(J8+)的练习:

// J7+
BitSet bitSet(final long... nums) {
    return BitSet.valueOf(nums);
}

// J8+
final IntStream bitsSet = bitSet(num).stream();

// vice-versa
BitSet bitSet(final IntStream bitsSet) {
    return bitsSet.collect(BitSet::new, BitSet::set, BitSet::or);
}

// without BitSet
IntStream bitsSet(final long... nums) {
    return IntStream.range(0, nums.length)
            .flatMap(n -> IntStream.range(0, Long.SIZE - 1)
                    .filter(i -> 0 != (nums[n] & 1L << i))
                    .map(i -> i + n * Long.SIZE));
}

【讨论】:

    【解决方案2】:

    如果您想要BitSet,请尝试:

    final byte b = ...;
    final BitSet set = BitSet.valueOf(new byte[] { b });
    

    如果你想要boolean[]

    static boolean[] bits(byte b) {
      int n = 8;
      final boolean[] set = new boolean[n];
      while (--n >= 0) {
        set[n] = (b & 0x80) != 0;
        b <<= 1;
      }
      return set;
    }
    

    或者,等价的,

    static boolean[] bits(final byte b) {
      return new boolean[] {
        (b &    1) != 0,
        (b &    2) != 0,
        (b &    4) != 0,
        (b &    8) != 0,
        (b & 0x10) != 0,
        (b & 0x20) != 0,
        (b & 0x40) != 0,
        (b & 0x80) != 0
      };
    }
    

    【讨论】:

    • 我遇到了这个答案并想注意 BitSet.valueOf() 方法仅在 Java 7 及更高版本中。该问题未指定 Java 版本,但如果您使用的是 Java 6,则应该能够采用其中一种方法来创建 boolean[] 来填充 BitSet 对象。
    • 不应该是set[n] = (b &amp; 0x80) != 0; 在你的第二个sn-p 中吗?并且您需要在您的 while 循环中进行后增量:while (n-- &gt; 0)。否则,您将跳过第 0 位。
    【解决方案3】:

    我来这个帖子是因为 Android 在 API 19 中添加了BitSet.valueOf()。 我使用了 oldrinb 的第二个已接受答案的 sn-p,但由于它有一些错误而不得不对其进行修改。此外,我修改它以返回一个 BitSet,但将其更改为 boolean[] 应该不是问题。请参阅我对他的回复的评论。

    这是现在成功运行的修改:

    public static BitSet toBitSet(byte b) {
        int n = 8;
        final BitSet set = new BitSet(n);
        while (n-- > 0) {
            boolean isSet = (b & 0x80) != 0;
            set.set(n, isSet);
            b <<= 1;
        }
        return set;
    }
    

    【讨论】:

      【解决方案4】:

      Java 7 有 BitSet.valueOf(long[]) 和 BitSet.toLongArray()

      int n = 12345;
      BitSet bs = BitSet.valueOf(new long[]{n});
      

      【讨论】:

        【解决方案5】:

        你可以这样做:

        char[] bits = Integer.toBinaryString(num).toCharArray(); 获取底层位字符串为char[]

        例如

        public BitSet getBitSet(int num){
            char[] bits = Integer.toBinaryString(num).toCharArray();  
            BitSet bitSet = new BitSet(bits.length);  
            for(int i = 0; i < bits.length; i++){  
                if(bits[i] == '1'){
                    bitSet.set(i, true);
                }
                else{
                    bitSet.set(i, false);
                }                
            }
            return bitSet;
        }  
        

        您也可以通过这种方式创建boolean [] 数组。

        【讨论】:

        • 你在这里做了双重工作——toBinaryString() 也迭代了这些位。您最好使用循环 while i &lt; Integer.SIZE 和直接位测试 0 &lt; (num &amp; 1 &lt;&lt; i)。更不用说新的BitSet 中的位已预设为false。简而言之,您的代码既冗长又低效。
        猜你喜欢
        • 2010-10-17
        • 1970-01-01
        • 2013-09-27
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 2012-09-01
        • 1970-01-01
        相关资源
        最近更新 更多