Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将字节或整数转换为位集_Java_Type Conversion_Bitarray - Fatal编程技术网

Java 将字节或整数转换为位集

Java 将字节或整数转换为位集,java,type-conversion,bitarray,Java,Type Conversion,Bitarray,我有以下资料: int num=Integer.parseInt(lineArray[0]); byte numBit= num & 0xFF; 有没有非常简单的方法将numBit转换为位数组?或者更好,有没有办法绕过int的字节转换,从num转换为位数组 谢谢您可以: char[]bits=Integer.toBinaryString(num.toCharArray()以char[]的形式获取底层位字符串 例如 public BitSet getBitSet(int num){

我有以下资料:

int num=Integer.parseInt(lineArray[0]);
byte numBit= num & 0xFF;
有没有非常简单的方法将
numBit
转换为位数组?或者更好,有没有办法绕过int的字节转换,从
num
转换为位数组

谢谢

您可以:

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;
}  
public位集getBitSet(int num){
char[]bits=Integer.toBinaryString(num.toCharArray();
BitSet BitSet=新的位集(bits.length);
对于(int i=0;i
您也可以通过这种方式创建
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;
}
Java7有BitSet.valueOf(long[])和BitSet.toLongArray()


我产生这个线程是因为Android在API 19中添加了
BitSet.valueOf()
。 我使用了oldrinb接受答案的第二个片段,但由于有一些错误,我不得不修改它。此外,我修改了它以返回一个位集,但将其更改为布尔[]应该不会有问题。见我对他的答复的评论

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

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;
}
公共静态位集到位集(字节b){
int n=8;
最终位集=新位集(n);
而(n-->0){
布尔isSet=(b&0x80)!=0;
集合(n,isSet);

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

//J7+
位集位集(最终长…nums){
返回BitSet.valueOf(nums);
}
//J8+
final IntStream bitsSet=位集(num).stream();
//反之亦然
位集位集(最终IntStream位集){
返回bitsSet.collect(BitSet::new、BitSet::set、BitSet::or);
}
//无位集
IntStream比特集(最终长…nums){
返回IntStream.range(0,nums.length)
.flatMap(n->IntStream.range(0,Long.SIZE-1)
.filter(i->0!=(nums[n]&1L i+n*Long.SIZE));
}

我想这也适用于您的情况…[Stackoverflow-位集与整数长度之间的转换][1][1]:您是指
布尔[]
还是
位集
?我找到了这个答案,并想指出
位集.valueOf()
方法仅适用于Java 7及更高版本。问题没有指定Java版本,但如果您使用Java 6,您应该能够采用以下方法之一创建布尔[]来填充位集对象。它不应该是
set[n]=(b&0x80)!=0;
在您的第二个代码段中?您需要在while循环中发布增量:
while(n-->0)
。否则您将跳过位0。您在这里做的是双重工作--
toBinaryString()
也迭代位。您最好使用while
i
循环和直接位测试
0<(num&1
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
  };
}
int n = 12345;
BitSet bs = BitSet.valueOf(new long[]{n});
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;
}
// 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));
}