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

另一篇分析如下:

byte为什么要与上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,于是结果总是我们想要的。

转载于:https://www.cnblogs.com/yeahwell/p/5533571.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403671.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

element 增加自由验证

<el-form-item label"社会统一信用代码" prop"socialCode"><el-input v-model"ruleForm.socialCode"></el-input></el-form-item> 主要是validator返回的是对象 rules: {socialCode: [ //社会统一信用代码{requir…

ADempiere 360LTS 地址(Address)的中国格式定制

地址(Address)的中国格式定制AD里面设置合作伙伴&#xff0c;仓库等需要输入地址的地方&#xff0c;目前都是按照美国的习惯&#xff0c;即使国家选择了中国&#xff0c;还是不符合国内习惯&#xff0c;下面通过配置可使地址按照&#xff1a;省、市、详细地址的格式显示1) 国家…

git 配置免密登陆

SSH免密码登录配置 注意&#xff1a;这些命令需要在git bash here中敲 注意先配置好账户名和邮箱 # git config user.name zhangsan # git config user.email zhangsanqq.com # 使用–global参数&#xff0c;配置全局的用户名和邮箱&#xff0c;只需要配置一次即可。推荐配置…

ASP.NET MVC URL重写与优化(初级篇)-使用Global路由表定制URL

ASP.NET MVC URL重写与优化(初级篇)-使用Global路由表定制URL 引言--- 在现今搜索引擎制霸天下的时代&#xff0c;我们不得不做一些东西来讨好爬虫&#xff0c;进而提示网站的排名来博得一个看得过去的流量。 URL重写与优化就是搜索引擎优化的手段之一。 假如某手机网站(基于AS…

js splice

splice(删除数组第几个,删除几个数据) splice(从第几个新增,如果设置为 0&#xff0c;则不会删除项目。,新增的对象)

PHP autoload实践

本文目的 本文简要的描述了PHP提供的autoload机制&#xff0c;以及在scake中使用实践。用于减少不必要的文件包含&#xff0c;提高php系统性能。 什么是__autoload php是脚本语言&#xff0c;不同于c只需要编译一次&#xff0c;php每次执行过程中都需要编译&#xff0c;所以…

mac无法ssh localhost

From: http://www.2cto.com/os/201203/123274.html mac 无法ssh localhost&#xff0c;错误提示&#xff1a;bash: /usr/local/bin/ssh_session: Permission denied 在网上找了很久也没有找到解决方案&#xff0c;最后根据提示自己摸索如下&#xff1a; 1.编辑/etc/sshd_confi…

文件加密及解密openssl

Openssl是一个开源的用以实现SSL协议的产品&#xff0c;它主要包括了三个部分&#xff1a;密码算法库、应用程序、SSL协议库。Openssl实现了SSL协议所需要的大多数算法。 下面我将单介绍使用Openssl进行文件的对称加密操作。 一、Openssl支持的加密算法有&#xff1a; -aes-128…

el-select回显

<el-select style"width:162px;" change"aaa" v-model"searchObj.id" placeholder"请选择"><el-option v-for"item in optionsId" :key"item.value" :label"item.value" :value"item.lab…

i标签content属性输入空白

content: \20; 表示里面有值&#xff0c;你可以随便操作了

Mac OS X下查看CPU信息

From: http://forum.51nb.com/tid698668 在终端输入&#xff1a;sysctl -a | grep ".cpu." 以下是我的电脑的输出信息: hw.ncpu: 8 hw.activecpu: 8 hw.physicalcpu: 4 hw.physicalcpu_max: 4 hw.logicalcpu: 8 hw.logicalcpu_max: 8 hw.cputype: 7 hw.cpusubtype:…

MS SQLSERVER 各种乱七八糟

2019独角兽企业重金招聘Python工程师标准>>> 这个是看完了sql语法的一点个人练手&#xff0c;没什么价值&#xff0c;权且当做记录 select employee_id,dept_code,last_name,manager_id from l_employees where last_name like %e%--%代表任意字符串 order by dept_…

第二阶段团队项目冲刺第三天

1.&#xff08;昨天干了什么&#xff09; 昨天基本将我们网站的框架搭建起来了&#xff0c;但是还是有很多的不完善&#xff0c;并没有达到我想要的效果。 2.&#xff08;今天准备干什么&#xff09; 今天计划完善我们的网站框架&#xff0c;添加一些一般网站都有的按钮、快捷方…

uni-app阻止事件冒泡

<!-- #ifdef MP-WEIXIN --><uni-icons v-if"key_word" tap.stop"closeInput(e)" class"input-uni-icon" type"closeempty" size"22" color"#ccc" /><!-- #endif -->注意&#xff1a;事件必须要…

[C++11 std::thread] 使用C++11 编写 Linux 多线程程序

From: http://www.ibm.com/developerworks/cn/linux/1412_zhupx_thread/index.html 本文讲述了如何使用 C11 编写 Linux 下的多线程程序&#xff0c;如何使用锁&#xff0c;以及相关的注意事项&#xff0c;还简述了 C11 引入的一些高级概念如 promise/future 等。 前言 在这个…

div 背景图 居中

这里主要是 background-position: center;属性很给力 div{width: 100%;height: 100%;background-image: url(../../../assets/initialize.png);background-repeat: no-repeat;background-size:70px 70px;background-position: center;}

CCNA知识总结(一)

什么是路由&#xff1a; 路由就是为了形成“FIB”。 在路由器上分为2大类&#xff1a; 1&#xff09; Coutrol Plane 控制平面就是&#xff1a;“路由协议”&#xff0c;就是为了2个设备之间的交互来形成“FIB”。 2&#xff09; Data Plane 数据平面就是&#xff1a;“Forw…

java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException

缺少aspectjweaver.jar转载于:https://www.cnblogs.com/MyITRoad0916/p/5555791.html

记录uni-app弹框事件无生命周期问题;uni-popup-dialog打开触发事件;uni-popup-dialog调用接口时机

项目需求&#xff1a;点击页面的 品牌型号 按钮&#xff0c;打开弹框&#xff0c;将 车架号码 参数传入接口获取到对应的 品牌型号列表&#xff0c;在进行选择后关闭弹框。 实际开发中&#xff0c;我在父组件里面引入了弹框子组件&#xff1b;诡异的事情发生了&#xff1a; 在…

js 值太大自动转换bignumber

大值转换 function toNonExponential(num) {var m num.toExponential().match(/\d(?:\.(\d*))?e([-]\d)/);return num.toFixed(Math.max(0, (m[1] || ).length - m[2]));}