在java中将位字符串转换为字节

在java中将位字符串转换为字节,java,byte,Java,Byte,我需要在Java中将每个位设置为1字节 bit7 - 1, bit6 - 1, bit5 - 1, bit4 - 0, bit3 – 0, bit2 – 0, bit1 – 0, bit0 – 0 我写过: byte extra_dop = 0b00000111; 但出现以下错误: 在-source 1.5中不支持二进制文字(使用-source 7或 更高级别以启用二进制文字) 我们在Java中不是这样做的。看看这个类,它是设置位标志的一种更方便的方法 嗯。让我换一种说法。Java是一

我需要在Java中将每个位设置为1字节

bit7 -  1,
bit6 -  1,
bit5 - 1,
bit4 -  0,
bit3 – 0,
bit2 – 0,
bit1 – 0,
bit0 – 0
我写过:

byte extra_dop = 0b00000111;
但出现以下错误:

在-source 1.5中不支持二进制文字(使用-source 7或 更高级别以启用二进制文字)


我们在Java中不是这样做的。看看这个类,它是设置位标志的一种更方便的方法


嗯。让我换一种说法。Java是一种面向对象的语言,与使用位运算符相比,它有高效的面向对象方法,可以以更友好的方式进行开发。我建议您使用,因为它使您的代码更具可读性,并且它可以支持比简单位掩码更多的标志。更好?

这取决于你想完成什么。如果您只想分配一个不会被二进制更改的值,那么您所做的就可以了,但是要使用该功能,您必须编译指定javac将接收符合java7的源代码(这就是错误消息所说的)。这取决于您的编译方式,如果您使用的是Netbeans或Eclipse,那么您将在项目属性配置中执行此操作(只需右键单击项目并查找属性,它将打开一个对话框,我现在不记得每个IDE中的源代码兼容性在哪里,但我几乎可以肯定它位于对话框的主屏幕上)


然而,如果您想稍后使用位操作编辑数字,那么您需要像@Sean使用位集所说的那样工作(实际上,您也可以像我们在C/C++中所做的那样,直接对数字使用位操作,这是不容易理解的,但却是可能的)。

二进制文字是在Java7中引入的

对于旧版本,请使用以下命令:

byte b = Byte.parseByte("00000111", 2);

正如错误消息所说,
0b…
语法在Java 5中还不存在(这似乎是您正在使用的);它是在Java 7中引入的。如果您使用的是Java 7,请确保您的编译器设置(在IDE或构建文件中)已设置为接受Java 7语法

位通常是从右向左计数的,所以如果你说位7是1,位6是1,等等。那么我希望二进制数是
11100000
,而不是
00000111

要在早于Java 7的Java版本的源代码中编写此代码,只需将其编写为十六进制或十进制数:

// Hexadecimal
byte extra_dop = (byte)0xE0; // or did you mean 0x07?

// Decimal
byte extra_dop = (byte)224; // or did you mean 7?
您还可以使用基数为2的
Integer.parseInt()

byte extra_dop = (byte)Integer.parseInt("11100000", 2);

(注意,您也可以使用
Byte.parseByte
,但它不会接受
11100000
,因为它超出了有符号的
Byte
类型的范围)。

您是否尝试过
Byte-extra\u-dop=0111b;
?您使用的是什么版本的Java,并且使用Java 7是一个选项吗?“这不是我们在Java中做事情的方式。”这句话太笼统了。虽然
位集
是一个选项,但使用单个
字节
值也是一个完全合法的选项。我同意它在技术上是有效的,但“有效的Java项目47:了解和使用库”建议我应该使用现有的解决方案,而不是重新设计它们。这取决于上下文。有时使用
位集
是合适的,有时则不合适。知道库的存在可以让你做出决定。假设我们存储了一百万个这样的条目-创建一百万个
位集
对象可能是错误的与仅仅创建一个百万字节数组相比,它的开销要大得多。OP显然只想存储8个标志,因此“它可以支持更多标志”在这种情况下,这不是一个好处。我认为建议对此进行研究是合理的,但我会将其作为注释而不是答案。因为他想要原始字节,而不是字节对象,所以他应该使用
parseByte
而不是
valueOf
。自动装箱从未注意到差异。感谢您指出,更新了答案。
Byte.parseByte(“11111111”,2);
->java.lang.NumberFormatException:值超出范围