字节到“位”数组

use*_*605 3 java primitive byte bit

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

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

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

Cod*_*per 6

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


jas*_*jas 6

您可以将字节加载到 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
Run Code Online (Sandbox Code Playgroud)

您可以要求任何位,但长度告诉您过去的所有位length() - 1都设置为0(false):

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

bit 75: false
Run Code Online (Sandbox Code Playgroud)