在剖析该问题前请看如下代码
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,于是结果总是我们想要的。

转载于:https://blog.51cto.com/mcmoo/660830

[转]java中byte转换int时为何与0xff进行与运算相关推荐

  1. byte与或运算 java_java中byte转换int时为何与0xff进行与运算

    本文总结了java中byte转换int时总是与0xff进行与运算的原因. 在剖析该问题前请看如下代码: public static String bytes2HexString(byte[] b) { ...

  2. byte转换int时为何与0xff进行与运算

    2019独角兽企业重金招聘Python工程师标准>>> ava中byte转换int时为何与0xff进行与运算 在剖析该问题前请看如下代码 public static String b ...

  3. java中byte转int时候为什么要0xff

    首先先了解 byte 是8位 取值范围是-128~127 int    是32位 补码.反码.原码 补码 :原码的反码+1 反码 :原码除符号位以外的全部取反 既0变1 1变0 以上是负数的补码,正数 ...

  4. Java中byte转int

    在java中,int是4个字节,但是有时我们拿到的byte是小于4个字节的,这个如何转换成int呢?下面我改进了别人的一个方法,有什么不对和可以改进的地方欢迎大家留言交流. public int by ...

  5. Java中byte转int的方法

    byte转化为int有两种情况: 1)要保持数值不变 应用场景:数值计算,等等. 方法:可以直接采用强制类型转换:int i = (int) aByte, 例如:若aByte=0xff(即数值为-1) ...

  6. java中byte、 int、char、long、float、double各占多少字节数?

    https://blog.csdn.net/github_34402358/article/details/100120944

  7. Java中String转换int

    public static void main(String[] args) {String a="123";System.out.println(Integer.parseInt ...

  8. Java中byte与16进制字符串的互相转换

    https://www.cnblogs.com/qinwangchen/p/5418028.html * Convert byte[] to hex string.这里我们可以将byte转换成int, ...

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

    java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送.者接收的数据都是 byte数组,但是int类型是4个byte组成的,如何把一个整形 ...

最新文章

  1. aws lambda使用_使用AWS Lambda安排Slack消息
  2. 添加数据功能java,SpringBoot+Vue实现数据添加功能
  3. cookie 的使用
  4. UVa1354 Mobile Computing
  5. 系统进程间的同步机制
  6. 【翻译】.NET 5 RC1发布
  7. 第八节:Task的各类TaskTResult返回值以及通用线程的异常处理方案
  8. emmet语法 1127
  9. 微服务教程--什么是 Nacos
  10. Linux配置防火墙
  11. 4666 Hyperspace stl
  12. php开发环境配置 iis6+php-5.2.1-Win32+mysql-5.0.18-win32+phpMyAdmin-2.7.0-pl2快速安装
  13. java怎么测试接口测试_java怎么测试接口
  14. hexo搭建博客系列(六)百度,必应,谷歌收录
  15. css设定元素左对齐,左对齐标签 - 右对齐选择元素(CSS)
  16. 用bat脚本写一个输入16进制转ascii码的代码
  17. Day8--复数和复变函数之拉普拉斯变换及反变换和Z变换及反变换
  18. 建设全功能团队——实践篇
  19. 主题:瑞萨16 位R8C/TINY 系列单片机
  20. 正则表达式的精确匹配和模糊匹配的写法区别

热门文章

  1. linux查看注册表信息,linux登录档(日志)相关简介
  2. @所有人,20 万大奖待领取!【全民找“BUG”】活动,等你!
  3. 看图说话:用户标签可以这样轻松创建
  4. 人文英语学习品牌「友邻优课」携手神策数据 精细化数据分析让每一次互动都有价值
  5. java excel上传--poi
  6. LeetCode35.搜索插入位置 JavaScript
  7. django-TDD
  8. oracle对象之存储函数
  9. JavaScript 闭包详解
  10. 对 Entity 的初步构思