Java 位移位,短字节转换

标签 java

<分区>

我目前正在做一个小项目,我最终弄乱了字节、短值等, 读了一些之后,我仍然不明白一些东西,比如什么是“位移位”,我们为什么要用它,什么时候需要它,它是如何工作的。

此外,我发现这个函数可以将 short 转换为字节:

private byte[] short2byte(short[] sData) {
    int shortArrsize = sData.length;
    byte[] bytes = new byte[shortArrsize * 2];
    for (int i = 0; i < shortArrsize; i++) {
        bytes[i * 2] = (byte) (sData[i] & 0x00FF);
        bytes[(i * 2) + 1] = (byte) (sData[i] >> 8);
        sData[i] = 0;
    }
    return bytes;

}

我想我理解这个函数,但我的问题是我不确定这两行在做什么:

bytes[i * 2] = (byte) (sData[i] & 0x00FF);
bytes[(i * 2) + 1] = (byte) (sData[i] >> 8);

我认为这与位移有关,所以有人可以解释一下这是什么意思吗?如果您有关于字节、短、位移位等的链接或良好文档,请尽可能包括在内。

亲切的问候

最佳答案

第一个:位移位

我猜你听说过二进制数。现在大多数人在我们的日常业务中使用十进制数字系统,其中数字范围为 0-9。您使用的每个数字都由 0-9 的数字组成。二进制只使用数字0和1,这对计算机使用来说非常方便,从此你可以轻松地表示数字的幂:

0 = 没有电

1 = 功率

与十进制数字系统相同,您只需将数字并排放置就可以得到更大的数字:在十进制中,10 等于 9+1。在二进制中,10 是 1+1。

Binary = Decimal
0   = 0
1   = 1
10  = 2
11  = 3
100 = 4
101 = 5
110 = 6
111 = 7

等等。

计算机通常使用固定长度的数字(至少使用整数类型的数字,如 int、long、short、byte 等),因此它们用 0 填充左侧所有剩余数字:

5 in decimal = 101 in binary = 00000101 in 8-bit (byte) = 0000000000000101 in 16-bit (short)

等等。

位移位的作用是将所有位移动到一个方向:

Right-Shift by two digits:
00001101 >> 2 = 00000011

Left-Shift by three digits:
00001101 << 3 = 01101000

左移相当于乘以2,右移相当于除以2(这里说的是正数,因为负数有点不同)。

现在进入第二个:掩蔽 现在是关于这部分的: 数据[i] & 0x00FF

首先,这里我们有另一种数字表示法:十六进制数。它的工作原理与刚才的二进制数非常相似,有 16 个不同的数字:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。它们中的每一个都代表四位二进制数字,因此您可以通过将每个数字替换为以下数字来在两者之间进行转换:

Hex = Binary
0   = 0000
1   = 0001
2   = 0010
3   = 0011
4   = 0100
5   = 0101
6   = 0110
7   = 0111
8   = 1000
9   = 1001
A   = 1010
B   = 1011
C   = 1100
D   = 1101
E   = 1110
F   = 1111

所以这里给出的数字 0x00FF 在 16 位二进制中等于 0000000011111111。

现在到 &,或实际的屏蔽。 &-运算符对于两个输入均为 1 的每一位返回 1,对于其中一个输入为 0 的每一位返回 0:

0101010101010101
&
0000000011111111
=
0000000001010101

所以您看,您可以使用 &-运算符屏蔽掉一个输入字符串中所有为 0 的位。

所以该函数的这一部分所做的是将 short(16 位长)拆分为两个单独的 8 位字节。假设 sData[i] 包含这个数字:0011001101010101

bytes[i * 2] = (byte) (sData[i] & 0x00FF);
=
bytes[i * 2] = (byte) (0011001101010101 & 0000000011111111);
=
bytes[i * 2] = (byte) (0000000001010101); //lower 8 bit



bytes[(i * 2) + 1] = (byte) (sData[i] >> 8);
=
bytes[(i * 2) + 1] = (byte) (0011001101010101 >> 8); //Right shift by 8 spaces
=
bytes[(i * 2) + 1] = (byte) (0000000000110011); //upper 8 bit

关于Java 位移位,短字节转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21581311/

相关文章:

java - Apache Spark 与 elasticsearch V5.X

java - JSF 限制

java - Java 中静态变量和方法的概念

java - 使用 Java Streams 计算并打印一条链中的唯一列表项

java - 调用方法而不启动 UI

java - LDAP中超时的实现

java - OAuth 2.0、Open ID 连接和 SAML

java - 获取一个对象并将其导出到其类之外

java - Jenkins 抛出 java.lang.NoSuchFieldException : theCaseInsensitiveEnvironment

Javadoc doclet : Get "@Nullable" annotation (javax). 如何在 doclet 中获取该注释?