Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.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中使用位移位_Java_Binary_Bit Manipulation_Packets - Fatal编程技术网

如何在Java中使用位移位

如何在Java中使用位移位,java,binary,bit-manipulation,packets,Java,Binary,Bit Manipulation,Packets,我正在尝试构造一个IP头 IP头包含以下字段:版本、IHL、DSCP等。我希望填充字节数组,以便以字节形式存储信息 然而,我感到困惑的是版本字段只有4位宽。IHL也只有4位宽。如何使这两个字段的值都表示为字节?我需要做比特转换吗 例如,版本=4,IHL=5。我需要创建一个字节,该字节等于0100 0101=45h或69位小数。仅仅因为一个字节是8位,而您的值最多只能是4,这不是问题。额外的4位总是零 因此,如果存储1,例如: 0000 0001 或15(哪个是最大值?): 0000 1111 要

我正在尝试构造一个IP头

IP头包含以下字段:版本、IHL、DSCP等。我希望填充字节数组,以便以字节形式存储信息

然而,我感到困惑的是版本字段只有4位宽。IHL也只有4位宽。如何使这两个字段的值都表示为字节?我需要做比特转换吗


例如,版本=4,IHL=5。我需要创建一个字节,该字节等于0100 0101=45h或69位小数。

仅仅因为一个字节是8位,而您的值最多只能是4,这不是问题。额外的4位总是零

因此,如果存储1,例如:

0000 0001

或15(哪个是最大值?):

0000 1111

要在一个字节中生成包含Version和IHL的压缩字段,请尝试执行以下操作

byte b = (byte)((Version << 4) + IHL);

byte b=(byte)((Version您可以这样做:

    int a = 0x04;
    a <<= 4;
    a |= 0x05;
    System.out.println(a);
inta=0x04;

字节移位在Java中是不可能的

但是,就逻辑而言,如果希望版本和IHL在一个字节中,可以使用以下方法

byte value = (byte) (IHL | VERSION << 4);

字节值=(字节)(国际人道主义法版本)此类疑问应在评论部分予以澄清。这不是一个answer@FaizPinkman有什么疑问?我给出了一个明确的答案,我不欣赏你的否决票。我是说,不管怎样,只要将它存储为一个完整字节就行了。问题是如何将这两个值放入一个字节。你似乎把Java与其他语言混淆了,w这里,一个字符相当于一个字节。
字节版本=5;字节IHL=4;字节b=(版本谢谢@Erickson-很好的答案。在将ints引入答案之前,最好只使用顶部部分。那么为什么我可以编译它而不出错,只使用字节而不使用强制转换?我应该使用什么编译器来测试这样的东西?
字节b=((字节)5)
类型不匹配:无法从int转换为byte
我使用bytes作为Version和IHL,没有收到错误
@erickson可能与Debian上两周前的javac和java版本一样(非常确定它是Debian)1.8.0_25-b17说,
错误:不兼容类型:可能从int到byte的有损转换
,1.7.0_67-b01说
错误:可能的精度损失
。Eclipse给出了我上面显示的消息。您还有来自JLS的引用。
(byte) (4 << 4) | 5
byte b = -128; // The byte value 0x80, -128d
int uint8 = b & 0xFF; // The int value 0x00000080, 128d
int i = b; // The int value 0xFFFFFF80, -128d
int uintr = (b & 0xFF) | 0x04; // 0x00000084
int sintr = b | 0x04; // 0xFFFFFF84