字节到“位”数组

时间:2015-04-01 16:43:08

标签: java byte bit primitive

一个字节是java提供的最小的数值数据类型但是昨天我第一次接触到字节流,并且在每个包的开头发送了一个标记字节,它提供了有关如何处理包的进一步说明。字节的每一位都有特定的含义,所以我需要将字节纠缠到它的8位。

您可能可以将字节转换为布尔数组或为每种情况创建一个开关,但这当然不是最佳做法。

这怎么可能在java中为什么java中没有位数据类型?

5 个答案:

答案 0 :(得分:4)

因为物理计算机上不存在位数据类型。您可以在大多数现代计算机上分配的最小分配是一个字节,也称为八位字节或8位。当你显示一个位时,你实际上只是将算术中的第一位拉出字节并将其添加到仍使用8字节空间的新字节。如果你想将位数据放在一个字节内,你可以将它存储为至少一个字节,无论你使用什么编程语言。

答案 1 :(得分:4)

您可以将字节加载到BitSet中。这种抽象隐藏了操纵单个位的血腥细节。

import java.util.BitSet;

public class Bits {
    public static void main(String[] args) {
        byte[] b = new byte[]{10};
        BitSet bitset = BitSet.valueOf(b);
        System.out.println("Length of bitset = " + bitset.length());
        for (int i=0; i<bitset.length(); ++i) {
            System.out.println("bit " + i + ": " + bitset.get(i));
        }
    }
}

$ java Bits
Length of bitset = 4
bit 0: false
bit 1: true
bit 2: false
bit 3: true

您可以询问任何位,但长度会告诉您length() - 1之后的所有位都设置为0(false):

System.out.println("bit 75: " + bitset.get(75));

bit 75: false

答案 2 :(得分:2)

看看java.util.BitSet。 您可以使用它来解释读取的字节,并可以使用get方法检查特定位是否设置如下:

byte b = stream.read();
final BitSet bitSet = BitSet.valueOf(new byte[]{b});
if (bitSet.get(2)) {
    state.activateComponentA();
} else {
    state.deactivateComponentA();
}
state.setFeatureBTo(bitSet.get(1));

另一方面,您可以轻松创建自己的位掩码,然后将其转换为字节数组(或只是字节):

final BitSet output = BitSet.valueOf(ByteBuffer.allocate(1));
output.set(3, state.isComponentXActivated());
if (state.isY){
    output.set(4);
}
final byte w = output.toByteArray()[0];

答案 3 :(得分:1)

这里是一个示例,希望对您有用!

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

答案 4 :(得分:0)

How is this possible in java why are there no bit datatypes in java?

大多数语言中没有位数据类型。并且大多数CPU指令集很少(如果有)指令专用于寻址单个位。您可以将缺少这些作为(语言或CPU)复杂性和需求之间的权衡。

操作单个位可以作为操作多个位的特殊情况;语言和CPU都配备了后者。

非常常见的操作,如测试,设置,清除,反转以及独占或全部支持整数原语类型(byte,short / char,int,long),同时对该类型的所有位进行操作。通过适当地选择参数,您可以选择要操作的位。

如果你考虑一下,字节数组一个位数组,其中这些位按8的包进行分组。使用逻辑运算符(AND {{)在数组中使用单个位相对简单1}},或&,XOR |和非^)。

例如,测试是否在字节中设置了位N可以使用带掩码的逻辑AND来完成,其中只设置要测试的位:

~

将其扩展为字节数组也没有什么神奇之处,每个字节由8位组成,因此字节索引只是位数除以8,而该字节内的位数是余数(模8): / p>

public boolean testBit(byte b, int n) {
    int mask = 1 << n; // equivalent of 2 to the nth power
    return (b & mask) != 0;
}