Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.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 字节到“;Bit";排列_Java_Byte_Bit_Primitive - Fatal编程技术网

Java 字节到“;Bit";排列

Java 字节到“;Bit";排列,java,byte,bit,primitive,Java,Byte,Bit,Primitive,字节是java提供的最小的数字数据类型,但昨天我第一次接触了ByTestStreams,在每个包的开头都发送了一个标记字节,它提供了关于如何处理包的进一步说明。字节的每一位都有特定的含义,所以我需要将字节纠缠成8位 您可能可以将字节转换为布尔数组,或者为每种情况创建一个开关,但这肯定不是最佳做法 为什么java中没有位数据类型?因为物理计算机上没有位数据类型。在大多数现代计算机上,可以分配的最小分配是一个字节,也称为八位字节或8位。当你显示一个位时,你实际上只是用算术从字节中取出第一位,然后把它

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

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


为什么java中没有位数据类型?

因为物理计算机上没有位数据类型。在大多数现代计算机上,可以分配的最小分配是一个字节,也称为八位字节或8位。当你显示一个位时,你实际上只是用算术从字节中取出第一位,然后把它加到一个新的字节中,这个字节仍然使用8位的空间。如果您想将位数据放在字节内,您可以这样做,但无论您使用何种编程语言,它都将至少存储为一个字节。

请查看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];

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

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

这在java中是如何实现的?为什么java中没有位数据类型?

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

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

整数基元类型(byte、short/char、int、long)支持测试、设置、清除、反转以及异或等非常常见的操作,一次对该类型的所有位进行操作。通过适当地选择参数,您可以选择要操作的位

仔细想想,字节数组是一个位数组,其中位被分组在8个包中。使用逻辑运算符(AND
&
,或
|
,XOR
^
和NOT
~
)处理数组中的单个位相对简单

例如,如果在字节中设置了位N,则可以使用逻辑AND和掩码进行测试,其中仅设置了要测试的位:

public boolean testBit(byte b, int n) {
    int mask = 1 << n; // equivalent of 2 to the nth power
    return (b & mask) != 0;
}
公共布尔测试位(字节b,int n){
int mask=1>>3;//除以8

int mask=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
}
公共静态字符串toBitArray(字节[]byteArray){
StringBuilder sb=新的StringBuilder();
for(int i=0;i
谢谢这听起来很合理。所以使用字节的逐位操作是可行的?@user3394605正是如此,如果你将所有字节放在一个数组中,你将在内存中有一个很好的紧凑位置,包含所有的位。因为记住JVM的工作方式是字节仍然使用与int一样多的空间。这是你从大小差异是通过将字节放入数组来实现的。介意详细说明一下吗?jas非常详细地阐述了如何使用它。因为我不清楚问题的作者试图做什么,所以我只想让他知道BitSet类。它可以用来包装有问题的字节,并为位置设置提供简单的获取/设置操作访问特定位。最好使用“编辑”按钮将其添加到您的答案中。通常,答案应该是自包含的,因为其他答案或评论可能会被删除或诸如此类。在查看低质量帖子时查看您的答案。简短是一个标准。;)有布尔类型和位集类型。
public boolean testBit(byte[] array, int n) {
    int index = n >>> 3; // divide by 8
    int mask = 1 << (n & 7); // n modulo 8
    return (array[index] & mask) != 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();
}