一个字节是java提供的最小的数值数据类型但是昨天我第一次接触到字节流,并且在每个包的开头发送了一个标记字节,它提供了有关如何处理包的进一步说明。字节的每一位都有特定的含义,所以我需要将字节纠缠到它的8位。
您可能可以将字节转换为布尔数组或为每种情况创建一个开关,但这当然不是最佳做法。
这怎么可能在java中为什么java中没有位数据类型?
答案 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;
}