byte0XFF的基础
前言
最近在做代码相关的优化,找到了一个二进制转十六进制的方法:
/*** 二进制转16进制* @param bin* @return 16进制字符串*/
public static String asHex(byte[] bin) {//一个byte为8位,一个十六进制为4位,所以长度乘以2StringBuilder bfHex = new StringBuilder(bin.length * 2);int i;for (i = 0; i < bin.length; i++) {if (((int) bin[i] & 0xff) < 0x10)//如果小于10,那么转化为16进制需要往前面加0,凑足两位bfHex.append("0");//转为为16进制字符串bfHex.append(Integer.toString((int) bin[i] & 0xff, 16));}return bfHex.toString();
}
为什么byte转int需要与0XFF
0XFF = {[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[1,1,1,1,1,1,1,1]};
- 一个
int
类型的数字&0XFF
,就是将这个数字的高24位全部置为0;
byte转化为一个int类型直接强转不行么?
- 一个
byte
转化为32位的int
类型,它的数值大小不会发生任何变化; - 如果是正数那么高位自动补充
0
; - 如果是负数那么高位补充的是
1
;
我们先看一段代码:
public static void main(String[] args) {System.out.println(Integer.toBinaryString(1));System.out.println(Integer.toBinaryString(-1));
}
输出结果:
1
11111111111111111111111111111111
- 学习计算机原理的时候我们知道计算机都是采用补码存储数据的;
1 = byte[00000001] = int {000000000000000000000000000000001} = 0x1
-1 = byte[11111111] = int {11111111111111111111111111111111} = 0xffffffff
我们在做二进制转16进制的时候,需要的是数据的正确性而不是数值的正确性。所以我们进行 0XFF
的时候抹掉了高24位,确保了数据二进制补码的完整新(同时也解释了转化的16进制如果小于10需要在前面加0的原因)。
我们从 BufferedInputStream.java
源代码中都可以找到获取下一个字节的方法 int read()
,最后的得到的字节也是需要 &0xff
转化为 int
类型进行返回的,这样才能保证数据的完整性。
总结
源码、反码、补码
源码
[+1]原 = 0000 0001
[-1]原 = 1000 0001
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值.;
反码
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
正数的反码是其本身;
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反;
补码
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
正数的补码就是其本身;
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1);
补码的设计有意识的引用了模运算在数理上对符号位的自动处理,利用模的自动丢弃实现了符号位的自然处理,仅仅通过编码的改变就可以在不更改机器物理架构的基础上完成的预期的要求(将减法变为加法),所以补码沿用至今。
计算机巧妙地把符号位参与运算, 并且将减法变成了加法, 背后蕴含了怎样的数学原理呢?
将钟表想象成是一个1位的12进制数. 如果当前时间是6点, 我希望将时间设置成4点, 需要怎么做呢?我们可以:
- 往回拨2个小时: 6 - 2 = 4
- 往前拨10个小时: (6 + 10) mod 12 = 4
- 往前拨10+12=22个小时: (6+22) mod 12 =4
2,3方法中的mod是指取模操作, 16 mod 12 =4 即用16除以12后的余数是4。 同余定理
所以钟表往回拨(减法)的结果可以用往前拨(加法)替代!
首先要确定二进制中模到底是多少。
在二进制加法运算中膜有0~127,膜为128(128个数),即为2的n次方。
2的n次方减一 = A + A[反]
2的n次方 = A + A[反] + 1
A[补] = A[反] + 1
2的n次方 = A + A[补]
所以可以将负数用补码方式进行变化进行 加操作
,符号为也可以参与运算。
文章到这里就全部讲述完啦,若有其他需要交流的可以留言哦!!
想阅读作者的更多文章,可以查看我 个人博客 和公共号:
byte0XFF的基础相关推荐
- java入门 慕路径,Java入门基础知识总结学习教程大全【必看经典】
类型的表达式,是循环条件,表达式3是党执行了一遍循环之后,修改控制循环的变量值. ??? for语句的执行过程是这样的:首先计算表达式1,完成必要的初始化工作:然后判断表达式2的值,如果表达式的值为t ...
- 提交表单自动刷新_Web自动化测试:元素的基础操作和浏览器基础操作
上一节,我们了解了如何定位元素,其实也有涉及对于元素的操作,这一节我们就详细的介绍一下对于元素的操作和对于浏览器的一些操作 一.对于元素的基础操作: clear():清除输入框内的文本 send_ke ...
- java mybatis基础
java mybatis基础 1.1 什么是mybatis? mybatis是一个优秀的持久层框架. 避免几乎所有的JDBC代码和手动设置参数以及获取结果集的过程. 可以使用简单的xml或者注解来配置 ...
- 【J2SE】学习基础
Java基础 语法基础 OO Exception Array 基础类 I/O Stream Collection/Generic Thread TCP/UDP GUI Meta Data Regula ...
- 【Linux系统】基础总结
我不太清楚运维部门具体是做什么的,就接触过一点点运维部门! 也就是是知道他们负责管理服务器,管理网络,管理项目部署 偶尔自己需要部署,不得不接触一些linux命令.简单总结一些基础 linux系统发展 ...
- 【Java 2 Platform Enterprise Edition】基础
问题1:为什么java是无关平台? 你之前用C或者C++写的源代码,编译好后,换一种操作系统,可能就执行不了了.因为新的操作系统不识别,你需要修改你的源码,并在新的操作系统上重新编译才能运行,比如Wi ...
- SpringCloud Alibaba微服务实战(一) - 基础环境搭建
说在前面 Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案.此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来 ...
- Redis概述和基础
Redis 1.NoSQL NoSQL = Not Only SQL(不仅仅是SQL) 泛指非关系型数据库的,随着web2.0互联网的诞生!传统的关系型数据库很难对付web2.0时代!尤其是超大规模的 ...
- pass基础架构分析
pass基础架构分析 Relay 和 TVM IR,包含一系列优化passes,可提高模型的性能指标,如平均推理,内存占用,或特定设备的功耗.有一套标准优化,及特定机器学习的优化,包括常量折叠,死代码 ...
最新文章
- HTML5十五大新特性
- Spring Boot 核心知识点总结,面试再也不怕了!
- 空间简史-人类认识空间的旅程与其对强化学习的启示
- 起风了2019-12-26
- matlab hold off没用,matlab中 hold on 与hold off的用法
- Oracle 11.2.0.3 [INS-41112] Specified network interface doesnt maintain connectivity across cluster
- 15款免费的 HTML5/CSS3 响应式网页模板
- php网站 小偷源代码
- pcie16x能插1x的卡嘛?_存储先锋,雷克沙633x TF卡评测
- matlab可以模拟力学实验吗,基于Matlab GUI的渗流力学虚拟仿真实验平台开发
- 【Rust指南】错误的分类与传递|使用kind进行异常处理
- Failed to prettify component
- 【渗透安全】利用腾讯云CDN节点隐藏连接Webshell的真实IP
- 二进制、十进制、八进制、十六进制 各代表的英文字母是什么
- 网友对sars病毒事件的对话(转)
- 使用Python和docTR提取车辆识别号
- 华为给了机会,为什么OV却没抓住?
- 2020PAKDD 阿里巴巴智能运维算法大赛TOP20 ——磁盘故障预测问题比赛思路、难点与问题总结
- jQuery获取(设置)自定义属性值
- 献给我曾经的偶像—特雷西·麦克格雷迪