`
hujin1979
  • 浏览: 80185 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java中byte转换int时为何与0xff进行与运算

 
阅读更多

在剖析该问题前请看如下代码

例一:

  1. /** 
  2.  * 从byte数组开始位置取4位得到一个int 
  3.  * @paramababyte数组 
  4.  * @return返回int值 
  5.  */  
  6. public staticint getIntFromByte(byte[] ba)  
  7. {  
  8.     int sum = 0;  
  9.     for (int i = 0; i < 4; i++)  
  10.     {  
  11.         int temp = ((int) ba[i]) & 0xff;  
  12.         temp <<= i * 8;  
  13.         sum = temp + sum;  
  14.     }  
  15.   
  16.     return sum;  
  17. }  
  18.   
  19. public static String bytes2HexString(byte[] b) {  
  20.     String ret = "";  
  21.     for (int i = 0; i < b.length; i++) {  
  22.         String hex = Integer.toHexString(b[i] & 0xFF);  
  23.         if (hex.length() == 1) {  
  24.             hex = '0' + hex;  
  25.         }  
  26.         ret += hex.toUpperCase();  
  27.     }  
  28.     return ret;  
  29. }  

上面是将byte[]转化十六进制的字符串,注意这里b[ i ]& 0xFF将一个byte和 0xFF进行了与运算,然后使用Integer.toHexString取得了十六进制字符串,可以看出
b[i]& 0xFF运算后得出的仍然是个int,那么为何要和 0xFF进行与运算呢?直接 Integer.toHexString(b[ i ]);,将byte强转为int不行吗?答案是不行的.

其原因在于:
1.byte的大小为8bits而int的大小为32bits,java的二进制采用的是补码形式。


二进制原码表示法

原码表示法是机器数的一种简单的表示法。其符号位用0表示正号,用:表示负号,数值一般用二进制形式表示。设有一数为x,则原码表示可记作[x]原。

例如,X1= +1010110

X2= -1001010

其原码记作:


[X1]原=[+1010110]原=01010110

[X2]原=[-1001010]原=11001010

byte是一个字节保存的,有8个位,8位的第一个位是符号位,也就是说0000 0001代表的是数1 ,1000 0001代表的就是-1 所以正数最大位0111 1111,也就是数字127 负数最大为1111 1111,也就是数字-127
在原码表示法中,对0有两种表示形式:


[+0]原=00000000

  [-0] 原=10000000

 

二进制补码表示法

java中采用的是补码的形式,下面介绍下什么是补码和反码;
1、反码:
        一个数如果是正,则它的反码与原码相同;
        一个数如果是负,则符号位为1,其余各位是对原码取反;

机器数的反码可由原码得到。如果机器数是正数,则该机器数的反码与原码一样;如果机器数是负数,则该机器数的反码是对它的原码(符号位除外)各位取反而得到的。设有一数X,则X的反码表示记作[X]反。

例如:X1= +1010110

X2= 一1001010

[X1]原=01010110

[X1]反=[X1]原=01010110

[X2]原=11001010

[X2]反=10110101


2、补码:

机器数的补码可由原码得到。如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在未位加1而得到的。设有一数X,则X的补码表示记作[X]补。

    ⑴一个数为正,则它的原码、反码、补码相同
    ⑵一个数为负,刚符号位为1,其余各位是对原码取反,然后整个数加1
 - 1的原码为                10000001
- 1的反码为                11111110
                                                   + 1
- 1的补码为                11111111

0的原码为                 00000000
0的反码为                 11111111(正零和负零的反码相同)
                                          +1
0的补码为               100000000(舍掉打头的1,正零和负零的补码相同)
 
利用溢出,我们可以将减法变成加法

对于十进制数,从9得到5可用减法:

    9-4=5  因为4+6=10,我们可以将6作为4的补数
    改写为加法:
    9+(10-4)= 9+6=15(去掉高位1,也就是减10)得到5.

对于十六进制数,从c到5可用减法:
    c-7=5    因为7+9=16 将9作为7的补数
    改写为加法:
    c+(16-7)=c+9=15(去掉高位1,也就是减16)得到5.
 在计算机中,如果我们用1个字节表示一个数,一个字节有8位,超过8位就进1,在内存中情况为(100000000),进位1被丢弃。


Integer.toHexString的参数是int,如果不进行0xff,那么当一个byte会转换成int时,由于int是32位,而byte只有8位,这时会进行填充,如果byte的最高位是0的话,int的前面填充0,例如01000001转化成int就变为00000000000000000000000001000001
如果byte的最高位是1的话,int的前面填充1例如11111111的十进制数为-1转换为int时变为11111111111111111111111111111111好多1啊,呵呵!即0xffffffff但是这个数是不对的,这种补位就会造成误差。和0xff相与后,高24比特就会被清0了,结果就对了。
分享到:
评论

相关推荐

    java byte相互转换详解左右位移

    1. **byte转int**:将一个byte转换为int,可以通过与0xFF进行按位与操作(AND),然后根据位移规则进行左移或右移操作。例如,`byte b = 10; int i = b & 0xFF;` 这里`b & 0xFF`操作的目的是保证只有低8位参与运算,...

    java byte数组与int,long,short,byte的转换实现方法

    本文将详细介绍如何在Java中将`byte`数组与其他基本数据类型(如`int`、`long`、`short`、`byte`)之间进行转换。 首先,我们来看`byte`到`int`的转换。Java中的`byte`类型是8位的,取值范围是-128到127。如果要将...

    在Java中int和byte[]的相互转换

    在Java编程语言中,有时我们需要将整型(int)数据与字节数组(byte[])之间进行转换,这在处理网络通信、序列化或存储数据时尤为常见。本文将深入探讨Java中int与byte[]的转换方法。 首先,让我们理解为什么需要进行...

    java基本类型与byte数组互相转换

    在Java编程语言中,基本类型的变量(如`short`、`int`、`long`、`char`、`double`和`float`)和`byte`数组之间的相互转换是一项非常实用的技术,尤其是在网络通信、文件读写等场景下。下面将详细介绍如何进行这些...

    基于java中byte数组与int类型的转换(两种方法)

    在Java编程中,将`int`类型转换为`byte`数组以及从`byte`数组还原回`int`类型是常见的操作,特别是在网络编程中。这是因为网络传输的数据通常以字节流的形式存在,而`int`等基本数据类型需要进行适当的序列化才能...

    Java任意长度byte数组转换为int数组的方法

    对于不正常的情况,比如3个byte转换为int,则第一个左移16位,第二位与0xff后左移8位,第三位与0xff,然后进行或运算即可。同理可运用于2个byte。对于1个byte,直接强制转换为int即可。 但是,当我们遇到一个byte...

    学习文档_JAVA中Integer和Byte转换.doc

    在进行位运算时,Java会将byte类型自动扩展为int类型进行操作,这是因为byte的范围较小,位运算需要更大的数据类型来容纳结果。 以下是一个将4字节数组转换为有符号整数的方法: ```java int ByteToSignedInt(byte...

    java int转byte和long转byte的方法

    在Java编程中,有时我们需要将整型(int)和长整型(long)的数据转换为字节(byte),这在处理网络传输、二进制序列化或内存优化等场景中尤其常见。以下是一些关于如何在Java中进行这些转换的方法。 首先,让我们看下...

    Java 字节数组类型(byte[])与int类型互转方法

    总结,Java中的`int`到`byte[]`和`byte[]`到`int`的转换涉及位运算,包括位移和按位与。理解这些基本的位运算对于处理二进制数据至关重要。在实际开发中,确保数据类型的正确转换是保证程序正常运行的关键步骤。

    C语言如何将int转byte类型

    在C语言中,数据类型是...在进行类型转换时,要确保 `int` 值在适当的范围内,或者使用适当的位运算和取模运算来处理溢出和负数。在实际编程中,应该根据具体需求选择合适的方法,并进行充分的测试以确保转换的正确性。

    hex2byte byte2hex

    - 遍历输入数组`b`,对于每一个`byte`,先通过位运算`& 0xFF`确保只考虑低八位有效值,然后调用`Integer.toHexString()`方法将其转换为十六进制字符串。 - 如果转换得到的字符串长度为1,则在其前面添加一个"0"以...

    java转换C生产dat文件

    ### Java与C语言之间的Dat文件转换及类型对齐 #### 概述 在跨语言编程环境中,例如Java程序需要处理由C语言生成的数据文件(dat文件),常常会遇到数据类型不一致导致的数据解析问题,尤其是当涉及到二进制数据时。...

    Cnic.Convert.rar_byte_数据类型转换

    在标题"Cnic.Convert.rar_byte_数据类型转换"中,我们可以看出这是关于在Java或者其他类似语言中进行数据类型转换的一个资源,特别是涉及`Int`、`Byte[]`和`Long`之间转换的方法。描述中提到的“位移”方法是一种...

    byte数组转化为hex

    在Java编程中,将字节数组转换为16进制字符串是一项常见的任务,尤其是在处理二进制数据、网络通信或者存储数据时。16进制(Hexadecimal)是一种数字表示方式,它使用16个符号(0-9和A-F)来表示数值,对于显示和...

    Java实现IEE754 Float类型数据

    - 当指数位为0且尾数位不为0时,代表的是次正规数(Subnormal Number),需要特别处理。 - 当指数位和尾数位均为0时,代表0。 - 当指数位全为1且尾数位也为0时,代表无穷大,正负由符号位决定。 #### 总结 本文...

    JAVA 进制转换 参考代码

    这里我们将深入探讨如何在Java中进行进制转换,以及如何实现从16进制到62进制的转换,这在生成固定策略的短链中非常常见。 首先,让我们理解基本的进制转换概念。进制是指数值系统中代表数字的符号数量。我们最熟悉...

    二进制与各种类型的数据转换.pdf

    例如,整数`int temp = 0x0F070301`在内存中以16进制表示为`0x0f x07 0x03 x01`,转换成二进制即为`00001111 00000111 00000011 00000001`。 2. **整数转byte数组** - 当需要将整数转换为byte数组时,可以通过逐位...

    JAVA中IP和整数相互转化的方法

    在Java编程中,IP地址和整数之间的转换是网络编程中的常见操作。这涉及到将IP地址(IPv4格式,如192.168.1.1)表示为一个整数,以及将整数还原为IP地址。下面将详细解释这两种转化方法,并提供相关的Java代码示例。 ...

    JAVA数字图像处理常用算法.pdf

    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_java_CRC16_

    - 然后,遍历数据数组,每次取出一个字节,将其转换为16位整数,并进行位移和异或操作。 - 每次迭代后,如果CRC寄存器的最高位为1,则与生成器多项式进行异或操作。 - 最后返回CRC寄存器的值。 例如: ```java ...

Global site tag (gtag.js) - Google Analytics