如何将一个字节转换为位?

7
我有一个字节数组。我想访问每个字节并获取其等效的8位二进制值,以便进行下一步操作。我听说过BitSet,但还有其他处理这个问题的方法吗?
谢谢。

谢谢大家!:) 我尝试了下面提供的所有方法,但我所做的是从数组中取出单个字节,然后使用方法Integer.toBinaryString(byte value)。它给了我想要的输出。 - Supereme
7个回答

11

如果你只需要它的二进制字符串表示,你可以简单地使用 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);
}

5
您可能会在Guava原语包中找到与您寻找的内容类似的东西。
或者,你可能想写一些类似于:
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的评价。 - Erick Robertson

3

BitSet.valueOf(byte[] bytes)

如果您没有使用Java 7,可能需要查看源代码以了解它是如何实现的。

该方法可以将字节数组转换为位集合。


2

Java有位运算符。请参阅教程示例

Java编程语言还提供了对整数类型执行按位和位移操作的运算符。本节讨论的运算符很少使用。因此,它们的涵盖范围很简短;其目的只是让您知道这些运算符存在。

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

byte值是整数型的,您可以使用掩码操作来检查位状态。最低有效位对应于掩码10x1,下一个位对应于0x2,依此类推。

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

if(b & 0x1)不能编译。你必须使用if(b & 0x1 == 0x1) - Peter Knego

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

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;
}

0

这是一个样例,希望对您有所帮助!

DatagramSocket socket = new DatagramSocket(6160, InetAddress.getByName("0.0.0.0"));
socket.setBroadcast(true);
while (true) {
    byte[] recvBuf = new byte[26];
    DatagramPacket packet = new DatagramPacket(recvBuf, recvBuf.length);
    socket.receive(packet);
    String bitArray = toBitArray(recvBuf);
    System.out.println(Integer.parseInt(bitArray.substring(0, 8), 2)); // convert first byte binary to decimal
    System.out.println(Integer.parseInt(bitArray.substring(8, 16), 2)); // convert second byte binary to decimal
}

public static String toBitArray(byte[] byteArray) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < byteArray.length; i++) {
            sb.append(String.format("%8s", Integer.toBinaryString(byteArray[i] & 0xFF)).replace(' ', '0'));
        }
        return sb.toString();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接