2010-11-04 134 views
7

我有一个字节数组。我想要访问每个字节并希望获得其相应的二进制值(8位),以便对其执行下一个操作。我听说过BitSet,但有没有其他解决方法?如何将字节转换为位?

谢谢。

+0

谢谢大家了!:)我尝试了所有下面给出的东西,但我所做的事情是我从阵取单个字节,然后我采用的方法Integer.toBinaryString(字节值)。它给了我期望的输出。 – Supereme 2010-11-04 16:49:49

回答

3
byte ar[] ; 
byte b = ar[0];//you have 8 bits value here,if I understood your Question correctly :) 
8

如果你只需要在二进制它的字符串表示,你可以简单地使用Integer.toString()设置为2二进制可选的第二个参数。

在执行常规位操作上的任何整数类型,你必须使用逻辑与位移操作符。

// tests if bit is set in value 
boolean isSet(byte value, int bit){ 
    return (value&(1<<bit))!=0; 
} 

// returns a byte with the required bit set 
byte set(byte value, int bit){ 
    return value|(1<<bit); 
} 
2

Java有bitwise operators。见a tutorial example

Java编程语言还提供了对整型类型执行按位和位移操作的运算符。本节讨论的操作符不太常用。因此,他们的报道很简短;目的只是让你意识到这些运营商的存在。

一元按位求补运算符“〜”反转的位模式;它可以应用于任何整型,使得每个“0”为“1”,每个“1”为“0”。例如,一个字节包含8位;将该运算符应用于位模式为“00000000”的值将其模式更改为“11111111”。

A byte值是不可或缺的,您可以使用掩蔽操作检查位状态。 最低显著位对应于面膜10x1,下位对应0x2

byte b = 3; 
if((b & 0x1) == 0x1) { 
    // LSB is on 
} else { 
    // LSB is off 
} 
+0

'if(b&0x1)'不能编译。你必须使用'if(b&0x1 == 0x1)' – 2010-11-04 10:17:00

+0

谢谢。Java不是C ;-) – gimel 2010-11-04 10:24:09

4

您可能会发现沿着你正在寻找在Guava Primitives包什么东西行。

或者,你可能想写点东西像

public boolean[] convert(byte...bs) { 
boolean[] result = new boolean[Byte.SIZE*bs.length]; 
int offset = 0; 
for (byte b : bs) { 
    for (int i=0; i<Byte.SIZE; i++) result[i+offset] = (b >> i & 0x1) != 0x0; 
    offset+=Byte.SIZE; 
} 
return result; 
} 

那不是测试,但这个想法是存在的。还可以轻松修改循环/赋值以返回其他数组(例如,intlong)。

+2

除非你使用了“elsewise”这个词,否则会给出这个+1。 – 2010-11-04 11:26:59

0

嗯,我想我得到你的意思它是如何实现的。现在一个相当大的错误是,它不适用于负数。但是,假设你没有使用它来读取文件输入,你可能仍然可以使用它。

public static ArrayList<Boolean> toBitArr(byte[] bytearr){ 
    ArrayList<Boolean> bitarr = new ArrayList<Boolean>(); 
    ArrayList<Boolean> temp = new ArrayList<Boolean>(); 
    int i = 0; 
    for(byte b: bytearr){ 
     while(Math.abs(b) > 0){ 
      temp.add((b % 2) == 1); 
      b = (byte) (b >> 1); 
     } 
     Collections.reverse(temp); 
     bitarr.addAll(temp); 
     temp.clear(); 
    } 
    return bitarr; 
}