java中byte转换int时为何与0xff进行与运算
在剖析该问题前请看如下代码
public static String bytes2HexString(byte[] b) {
String ret = "";
for (int i = 0; i < b.length; i++) {
String hex = Integer.toHexString(b[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
ret += hex.toUpperCase();
}
return ret;
}
上面是将byte[]转化十六进制的字符串,注意这里b[i] & 0xFF将一个byte和 0xFF进行了与运算,然后使用Integer.toHexString取得了十六进制字符串,可以看出
b[i] & 0xFF运算后得出的仍然是个int,那么为何要和 0xFF进行与运算呢?直接 Integer.toHexString(b[i]);,将byte强转为int不行吗?答案是不行的.
其原因在于:
1.byte的大小为8bits而int的大小为32bits
2.java的二进制采用的是补码形式
在这里先温习下计算机基础理论
byte是一个字节保存的,有8个位,即8个0、1。
8位的第一个位是符号位,
也就是说0000 0001代表的是数字1
1000 0000代表的就是-1
所以正数最大位0111 1111,也就是数字127
负数最大为1111 1111,也就是数字-128
上面说的是二进制原码,但是在java中采用的是补码的形式,下面介绍下什么是补码
1、反码:
一个数如果是正,则它的反码与原码相同;
一个数如果是负,则符号位为1,其余各位是对原码取反;
2、补码:利用溢出,我们可以将减法变成加法
对于十进制数,从9得到5可用减法:
9-4=5 因为4+6=10,我们可以将6作为4的补数
改写为加法:
9+6=15(去掉高位1,也就是减10)得到5.
对于十六进制数,从c到5可用减法:
c-7=5 因为7+9=16 将9作为7的补数
改写为加法:
c+9=15(去掉高位1,也就是减16)得到5.
在计算机中,如果我们用1个字节表示一个数,一个字节有8位,超过8位就进1,在内存中情况为(100000000),进位1被丢弃。
⑴一个数为正,则它的原码、反码、补码相同
⑵一个数为负,刚符号位为1,其余各位是对原码取反,然后整个数加1
- 1的原码为 10000001
- 1的反码为 11111110
+ 1
- 1的补码为 11111111
0的原码为 00000000
0的反码为 11111111(正零和负零的反码相同)
+1
0的补码为 100000000(舍掉打头的1,正零和负零的补码相同)
Integer.toHexString的参数是int,如果不进行&0xff,那么当一个byte会转换成int时,由于int是32位,而byte只有8位这时会进行补位,
例如补码11111111的十进制数为-1转换为int时变为11111111111111111111111111111111好多1啊,呵呵!即0xffffffff但是这个数是不对的,这种补位就会造成误差。
和0xff相与后,高24比特就会被清0了,结果就对了。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sunyujia/archive/2008/05/04/2385727.aspx
分享到:
相关推荐
在Java中,基本数据类型byte与int之间的相互转换涉及到计算机的二进制运算、位移操作以及补码的概念。我们首先了解Java中int和byte的数据结构,然后探讨它们之间的转换方法及其背后的原理。 **基本数据类型结构:**...
本文将详细介绍如何在Java中将`byte`数组与其他基本数据类型(如`int`、`long`、`short`、`byte`)之间进行转换。 首先,我们来看`byte`到`int`的转换。Java中的`byte`类型是8位的,取值范围是-128到127。如果要将...
在Java编程语言中,基本类型的变量(如`short`、`int`、`long`、`char`、`double`和`float`)和`byte`数组之间的相互转换是一项非常实用的技术,尤其是在网络通信、文件读写等场景下。下面将详细介绍如何进行这些...
在Java编程语言中,有时我们需要将整型(int)数据与字节数组(byte[])之间进行转换,这在处理网络通信、序列化或存储数据时尤为常见。本文将深入探讨Java中int与byte[]的转换方法。 首先,让我们理解为什么需要进行...
注意,由于`byte`类型的范围是 `-128` 到 `127`,在进行位运算时可能会丢失高8位,因此需要使用`& 0xff`来保留低8位。 ### 方法二:使用`DataInput`和`DataOutput`流 ```java public static void main(String[] ...
对于不正常的情况,比如3个byte转换为int,则第一个左移16位,第二位与0xff后左移8位,第三位与0xff,然后进行或运算即可。同理可运用于2个byte。对于1个byte,直接强制转换为int即可。 但是,当我们遇到一个byte...
在进行位运算时,Java会将byte类型自动扩展为int类型进行操作,这是因为byte的范围较小,位运算需要更大的数据类型来容纳结果。 以下是一个将4字节数组转换为有符号整数的方法: ```java int ByteToSignedInt(byte...
在Java编程中,有时我们需要将整型(int)和长整型(long)的数据转换为字节(byte),这在处理网络传输、二进制序列化或内存优化等场景中尤其常见。以下是一些关于如何在Java中进行这些转换的方法。 首先,让我们看下...
总结,Java中的`int`到`byte[]`和`byte[]`到`int`的转换涉及位运算,包括位移和按位与。理解这些基本的位运算对于处理二进制数据至关重要。在实际开发中,确保数据类型的正确转换是保证程序正常运行的关键步骤。
在C语言中,数据类型是...在进行类型转换时,要确保 `int` 值在适当的范围内,或者使用适当的位运算和取模运算来处理溢出和负数。在实际编程中,应该根据具体需求选择合适的方法,并进行充分的测试以确保转换的正确性。
- 遍历输入数组`b`,对于每一个`byte`,先通过位运算`& 0xFF`确保只考虑低八位有效值,然后调用`Integer.toHexString()`方法将其转换为十六进制字符串。 - 如果转换得到的字符串长度为1,则在其前面添加一个"0"以...
### Java与C语言之间的Dat文件转换及类型对齐 #### 概述 在跨语言编程环境中,例如Java程序需要处理由C语言生成的数据文件(dat文件),常常会遇到数据类型不一致导致的数据解析问题,尤其是当涉及到二进制数据时。...
在标题"Cnic.Convert.rar_byte_数据类型转换"中,我们可以看出这是关于在Java或者其他类似语言中进行数据类型转换的一个资源,特别是涉及`Int`、`Byte[]`和`Long`之间转换的方法。描述中提到的“位移”方法是一种...
总结来说,Java中字节数组与16进制字符串之间的转换涉及到位运算、字符映射以及字符串处理。了解这些概念对于处理二进制数据至关重要,特别是在网络编程、文件读写和数据序列化等场景中。希望以上内容能帮助你更好地...
### Java实现IEEE 754 Float类型数据解析 ...通过对浮点数结构的深入理解,我们可以更准确地处理和表示浮点数,在进行科学计算或数据处理时提供更精确的结果。希望本文能够帮助读者更好地理解和应用IEEE 754标准。
这里我们将深入探讨如何在Java中进行进制转换,以及如何实现从16进制到62进制的转换,这在生成固定策略的短链中非常常见。 首先,让我们理解基本的进制转换概念。进制是指数值系统中代表数字的符号数量。我们最熟悉...
例如,整数`int temp = 0x0F070301`在内存中以16进制表示为`0x0f x07 0x03 x01`,转换成二进制即为`00001111 00000111 00000011 00000001`。 2. **整数转byte数组** - 当需要将整数转换为byte数组时,可以通过逐位...
在Java编程中,IP地址和整数之间的转换是网络编程中的常见操作。这涉及到将IP地址(IPv4格式,如192.168.1.1)表示为一个整数,以及将整数还原为IP地址。下面将详细解释这两种转化方法,并提供相关的Java代码示例。 ...
nWidth = (((int)bi[7]& 0xff))| (((int)bi[6]& 0xff))| (((int)bi[5]& 0xff)) | (int)bi[4]& 0xff; nHeight = (((int)bi[11]& 0xff))| (((int)bi[10]& 0xff))| (((int)bi[9]& 0xff)) | (int)bi[8]& 0xff; ``` 这里...
CRC16(Cyclic Redundancy Check,循环冗余校验)...Java中的实现通过定义生成器多项式、初始化CRC寄存器、进行位移和异或操作,最终计算出CRC16校验码。CRC16.java文件中的`calculateCRC`函数就是这个过程的具体体现。