java中int与byte相互转换
基础内容简介
在做转换之前先要明确几个简单的概念。首先本文是以java为语言,以int为例子。 long数据类型在原理上是一致的。
1 int 在java中是32位, byte是8位。
2 原码,反码,补码简介
原码:就是二进制码,最高位为符号位,0表示正数,1表示负数,剩余部分表示真值。
反码:在原码的基础上,正数反码就是他本身,负数除符号位之外全部按位取反。
补码:正数的补码就是自己本身, 负数的补码是在自身反码的基础上加1.
3 看到这里又涉及到了一个按位与的操作, 所以我们要理解&(与), | (或), ^ (异或),~ (按位取反)
& :当2个都为1的时候为1, 其他都是0 。 1&1 = 1, 1&0 = 0, 0&0 = 0; 他的作用是清0
| : 当2个只要有一个为1,就是1. 1|0 = 1; 0|0 = 0, 1|1 = 1;
^: 相同为0, 不相同为1, 1^0 = 1, 1^1 = 0, 0^0 = 0; 他的作用是定位翻转。
~: 按位取反,0变为1, 1变为0;
之所以要明确原码,反码,补码,是因为java中变量都是以补码的形式保存的。
比如 整行30 他的原码是:0001 1110. 正数,所以反码,补码都是0001 1110.
对于负数:-7 ,他的原码是 1000 0111, 第一位1表示是此数是负数。他的反码是:1111 1000, 补码在反码的基础上加1, 所以它的补码是1111 1001, 所以他的二进制数就是1111 1001. 对于负数根据二进制求真值,就是再补码的基础上再求补码。 而之所以引入补码的原因是因为: 1 如果用源码,那么0000 0000 和1000 0000 貌似都0, +0 , 和- 0. 所以这造成了问题,第二个原因是因为cpu计算器只有加法没有减法, 减法需要用正数和负数相加得到。
如“-16+11”的运算:
11110000 + -16的补码
00001011 11的补码
————
11111011 - 5的补码
4 因为byte是8位,int是32位所以在转换过程中,肯定涉及到了移位, 在java中<< (左移), >>(带符号右移), >>>(无符号右移)
<< 左移,比如, a << b, a表示需要移位的整行, b表示向左移动的位数, 左移的规则是,右端(低位)补0, 丢去高位
比如 0000 0000 0000 0110, 左移2位就是0000 0000 0001 1000. 如果移动的位数大于32, 那么就需要取余, 比如移动34位,那么实际应该是 : 34%32 = 2, 左移2位。左移在不溢出的情况下移动一位就相当于乘2。
>>右移,比如 , a >>b, a表示需要变换的数值, b表示移动的位数,右移的一点要明确,符号位不变,左端(高位)补充的是符号位,比如 0000 0000 0000 1011, 右移2位是 1100 0000 0000 0010. 负数的移位高位补充的是1, 因为这个,所以变换的时候需要&0xFF.
>>>无符号右移,顾名思义是指移动的时候不考虑符号,右移的时候高位补0.
代码
明确了以上概念,写代码反而简单了:
/*** int到byte[] 由高位到低位* @param i 需要转换为byte数组的整行值。* @return byte数组*/public static byte[] intToByteArray(int i) {byte[] result = new byte[4];result[0] = (byte)((i >> 24) & 0xFF);result[1] = (byte)((i >> 16) & 0xFF);result[2] = (byte)((i >> 8) & 0xFF);result[3] = (byte)(i & 0xFF);return result;}/*** byte[]转int* @param bytes 需要转换成int的数组* @return int值*/public static int byteArrayToInt(byte[] bytes) {int value=0;for(int i = 0; i < 4; i++) {int shift= (3-i) * 8;value +=(bytes[i] & 0xFF) << shift;}return value;}
java中int与byte相互转换相关推荐
- java 中 image 和 byte[] 相互转换
转载自 java 中 image 和 byte[] 相互转换 只需要一个存储了图片信息的二进制串(byte[]) 然后,这样: InputStream buffin = new ByteArrayI ...
- Java中Int转byte分析
针对声明变量 int i = 3,j = 8; int占4个字节,i = 3 在Java二进制表示: 00000000 00000000 00000000 00000011 j = 8 在Java二进 ...
- C++中INT与BYTE相互转换
- java int byte数组_Java 中int与byte数组转换详解
1.与运算符的理解(&): 参加运算的两个数据,按二进位进行"与"运算.如果两个相应的二进位都为1,则该位的结果值为1,否则为0.即 0&0=0:0&1=0 ...
- Java中int的取值范围的原因
为什么Java中int型数据取值范围是[-231, 231-1] 为什么Java中int型数据取值范围是[-231,231-1],网上很多解释都存在问题. int是Java中的8种基本类型之一,一个i ...
- 关于java中int类型的取值范围等问题
java中int类型取值范围问题 java中int的类型占4个字节,与操作系统无关,要弄明白int的取值范围问题. 首先,我们来看一下byte的取值范围 byte 大小一个字节. 如:1111 111 ...
- java中int与char之间的互相转化
引言 在介绍java中int与char之间的互相转化之前,让我们先简单的回顾一些会涉及到的知识. 数据类型 在介绍int与char的转换之前,我们先来回顾一下java中的基本数据类型: 类型 大小 包 ...
- Java 中Int转String的三种方法
JAVA 中int类型转String类型的三种通常方法: 1.String.valueOf(int i) 2.Integer.toString(int i) 3.i + ""; / ...
- JAVA中int、String的类型转换(亲测)
int -> String int i=12345; String s=""; 第一种方法:s=i+""; 第二种方法:s=String.valueOf( ...
- java中int转成String位数不足前面补零
转载自:http://ych0108.iteye.com/blog/2174134 java中int转String位数不够前面补零 String.format("%010d", 2 ...
最新文章
- MVC+Ninject+三层架构+代码生成 -- 总结(一、數據庫)
- java中JUnit单元测试的使用方法
- 手撕 CNN 经典网络之 VGGNet(PyTorch实战篇)
- ajax 链接java_如何使用ajax将下拉菜单链接到表
- 【README】二叉树刷题框架
- PNP问题-位姿估计方法梳理(pose estimation)
- FreeRTOS(2)---学习FreeRTOS前的准备工作
- C++面试题-指针-动态内存指针
- Illustrator 教程,如何在 Illustrator 中重新塑造文本?
- MAC OS X 技术内幕 学习笔记之一 MAC OS的变迁
- PyQt5最详细pyrcc5配置+样式使用
- html背景图片固定代码
- 电视盒子做文件共享服务器,【当贝市场】智能电视盒子和PC电脑文件共享教程...
- 多智能体系统的分布式协同控制——采样控制、脉冲控制、弹性控制
- MPC+MPD听音乐
- 液晶屏及液晶模组英文行业术语
- 专访STEM领域人才资深人工智能图像算法工程师张旦
- Android逆向学习(1)--记一次破解某直播盒子App
- html 自动排序表格,表格排序.html
- 2008年专转本计算机试卷解,2005-2008年专转本计算机真题及答案
热门文章
- VS2008安装部署应用程序安装包制作过程
- 富士施乐Fuji Xerox DocuCentre-III C6500 驱动
- 2020年注册电气工程师基础考试大纲:公共基础(供配电、发输变电相同)
- [转载]注册电气工程师(供配电)执业资格考试基础考试大纲
- 木材材积表快速计算器_木材材积计算器下载_木材材积速算器普通分级版(电脑版)...
- 开源盛世:谈谈开源代码的使用与安全风险
- Latex转word的一款软件-Pandoc
- latex的下载与安装
- MinGW安装及介绍
- 教妹学Java(十):Unicode字符集简介