`

(转)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了,结果就对了。

----
Java中的一个byte,其范围是-128~127的,而Integer.toHexString的参数本来是int,如果不进行&0xff,那么当一个byte会转换成int时,对于负数,会做位扩展,举例来说,一个byte的-1(即0xff),会被转换成int的-1(即0xffffffff),那么转化出的结果就不是我们想要的了。

而0xff默认是整形,所以,一个byte跟0xff相与会先将那个byte转化成整形运算,这样,结果中的高的24个比特就总会被清0,于是结果总是我们想要的。

分享到:
评论

相关推荐

    Java中byte转int的方法

    byte转化为int有两种情况:  1)要保持数值不变  应用场景:数值计算。等等。  方法:能够直接?用强制类型转换:int i = (int) aByte, ...  比如:若aByte=0xff,转化为int后。i为0x000000ff。

    与上0xFF的意义.zip

    有些人,不太懂,C语言中为什么出现“&0xFF”,它存在的意义是什么,是补零?不会,他只是按位与,没有补零的功效,那到底是什么,这里会告诉你,而且不枉你的5积分!

    关于(hd32) 和 (0xff)

    map /iso.iso (0xff) || map --mem /iso.iso (0xff) 直接将iso映射为光盘; 若失败,则将iso载入内存后再映射。 请尽量用 (0xff) 来代替 (hd32), 就是说,原来你用 map (hd0,0)/iso.iso (hd32) 的, 你可以...

    JAVA微信公众平台Token验证

    首先要开启开发模式必须要进行Token的一个验证,你给出一个地址,微信发送请求,然后你给出相应,就这么简单。虽然说是简单,但是这是事后才说的,官方只有PHP的DEMO,我用JAVA开发的时候各种蛋疼不会弄,不过好在...

    把bin填充0xFF到指定大小(含源码)

    在mcu开发的时候, 特别是做升级文件的时候, 我们有时候需要把一个bin文件,填充指定大小,填充0xFF。 做了一个很简单的小工具,填充0xFF,到指定大小,例如16K。利用批处理就可以执行,支持相对路径。

    MD5加密测试_java类

    使用MD5对字符进行加密处理。... int val = ((int) md5Byte[i]) & 0xff; if (val ) hexValue.append("0"); hexValue.append(Integer.toHexString(val)); } return hexValue.toString(); }

    DES对称分组密码系统的Java实现

    import java.security.spec.*; import javax.crypto.*; import javax.crypto.spec.*; class DES01 { private String ... + java.lang.Integer.toHexString(data[i]&0xFF); } return str.toUpperCase(); } } }

    Python中不同进制的语法及转换方法分析

    本文实例讲述了Python中不同进制的语法及转换方法。分享给大家供大家参考,具体如下: 不同进制的书写方式 ① 八进制(Octal) 0o377 ② 十六进制(Hex) 0xFF ③ 二进制(Binary) 0b11111111 不同进制之间的转换 Python...

    基于单片机的LED16x16点阵显示

    {0xFE 0xFF 0xEE 0xFF 0xEE 0xFF 0xEE 0xF7 0xC0 0x03 0xDE 0xFF 0xBE 0xFF 0xBE 0xFF 0x7E 0xEF 0xC0 0x07 0xFE 0xFF 0xFE 0xFF 0xFE 0xFF 0xFE 0xFB 0x00 0x01 0xFF 0xFF } {0xFE 0xFF 0xFE 0xFF 0xFD 0x7F 0xFB ...

    将bin填充0xFF到指定大小(含源码)

    升级flash时,flash大小必须是16M,下载的flash文件有时不足16M,便做了个小工具,将bin填充0xFF到指定大小。

    ansix98算法java实现

    则 PIN BLOCK 为 0x06 0x12 0x34 0x56 0xFF 0xFF 0xFF 0xFF 异或 0x00 0x00 0x67 0x89 0x01 0x23 0x45 0x67 结果为 0x06 0x12 0x53 0xDF 0xFE 0xDC 0xBA 0x98 设:磁卡上的主帐号为:1234567890123456 截取下的主...

    STC12C5A60S2温度控制PWM脉宽

    unsigned char code table1[] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; /************************************** 延时X微秒(STC12C5A60S2@12M) 不同的工作环境,需要调整此函数 此延时函数是...

    linux 下将指定文件以0xFF填充到指定大小源码

    linux 下将指定文件在结尾添加0xFF添加到指定大小(源码)。用法gcc 编译后运行,有帮助命令。4G以上文件未测试。(A:代码风格糟糕注释少,还是没人用的生僻工具,骗分!B:啥~骗分?技术上的事情不叫骗。)

    VC 转换COLORREF值为RGB分量.rar

    VC 转换COLORREF值为RGB分量,举个例子,在本例中,是将COLORREF值:0x000080FF转换成:R分量:0xFF、G分量:0x80、B分量:0x00,注意,并不是分离。请看定义:  //R分量  BYTE RED = GetRValue(cr);  //G分量  ...

    标准MFC WinSock ActiveX控件开发实例(II)高级篇

    case 0://默认形式,这时如果发现Data为整型数组,将不进行任何转换,直接把一个int传给一个char传送(数据可能溢出范围) case 1://当指定该值为1时,当Date为长整型数组时,将把一个long转换成四个char传送 case 2://...

    汉字转换成中文拼音pinyin4j-2.5.0.jar

    输入汉字可以转换成中文拼音。内包含jar包和demo public class PinYin { public static String getPinYin(String src){ char[] t1 = null; t1=src.toCharArray(); String[] t2 = new String[t1.length]; ...

    python实现颜色rgb和hex相互转换的函数

    下面的python代码提供了两个函数分别用来将rgb表示的颜色转换成hex值,hex转换成rgb,rgb为一个三个数的元祖,如(128,255,28),hex为数字876645 def hex2rgb(hexcolor): rgb = [(hexcolor &gt;&gt; 16) & 0xff, (hex...

    JAVA 解析 Excel 工具 Java 解析、生成 Excel 比较有名的框架.rar

    比如07版Excel解压缩以及解压后存储都是在内存中完成的&#xff0c;内存消耗依然很大。easyexcel重写了poi对07版Excel的解析&#xff0c;能够原本一个3M的excel用POI sax依然需要100M左右内存降低到几M&#xff0c;并且再大的...

    【实验39】1602液晶显示数字0-0xFF.zip源码arduino例程源码GL9例程源代码

    【实验39】1602液晶显示数字0-0xFF.zip源码arduino例程源码GL9例程源代码【实验39】1602液晶显示数字0-0xFF.zip源码arduino例程源码GL9例程源代码【实验39】1602液晶显示数字0-0xFF.zip源码arduino例程源码GL9例程源...

    51单片机数模转换程序

    uchar weima[] = {0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; void delayms(uint xms) { uint i,j; for(i=xms;i&gt;0;i--) //i=xms即延时约xms毫秒 for(j=110;j&gt;0;j--); } void display(uchar bai,uchar shi,uchar ge...

Global site tag (gtag.js) - Google Analytics