Byte说明:
来源:https://blog.csdn.net/leo_eight/article/details/52724620
在Java里byte类型是占用1个字节,即8位的,而16进制的字符占用4位,所以1byte可以用两个字符来表示。
实例:
byte a = 123 用二进制表示:0111 1011
每4位用字符表示: 7 b
解析:
byte a = 123; // 这样定义,这个 123 到底是二进制,还是10进制,还是 X 进制,系统是不知道的。在这里,123 默认被当作 10 进制。
Java 不支持显式输入二进制,默认为 10 进制,0 开头为8进制,比如 01111,0x开头为16 进制,比如 0x11。byte 数据类型所表示的范围为 -128~127。
String类型的字符串转成用十六进制表示
-
将String类型内容转成byte[],如下所示
String srcStr = "333";
srcStr.getBytes()---------->结果是:[51, 51, 51] -
将[51, 51, 51]转成用十六进制表示
[51, 51, 51] ------>[3, 3, 3, 3, 3, 3]
注意点:
小写字符:{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd','e', 'f' }
大写字符:{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D','E', 'F' }
(1)三个51是保存在byte数组里的
(2)51 是十进制
(3)将51转成十六进制:小写字符[(0xF0 & 51) >>> 4 ]得到的是高位的3
小写字符[0x0F & 51] 得到的是低位的3
即一个字节的(51) 用两个十六位来表示
得到的3 3保存在byte数组中
- 将[3, 3, 3, 3, 3, 3]转成string输出 最后输出333333
String out = new String([3, 3, 3, 3, 3, 3])
将十六进制的字符串转成byte字节数组
例如"4161" 转成 "Aa"
- 将"4161"转成char数组 [4, 1, 6, 1] : 即str.toCharArray()
- 将[4, 1, 6, 1]中的每个字符先判断是否符合十六进制字符,符合,就将每个字符转成的十进制
int digitH = Character.digit(4, 16) ---->4
int digitL = Character.digit(1, 16) ---->1
digitH左移4为 digitH << 4 ----> 64 - int out = (digitH << 4) | digitL ------>65
- byte[i] bytestr = out
变成String输出 : new String(bytestr)
Java的左移和右移
左移:<<
左移一位相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
比如
10 << 1 = 10 * 2^1 = 20
10 << 3 = 10 * 2^3 = 80
带符号左移:
左移操作时将运算数的二进制码整体左移指定位数,左移之后的空位用0补充。
比如
正数:
int a = 5 ;
int b = a << 2 ;
[ 0000 0000 0000 0000 0000 0000 0000 0101 ] 5的补码
[ 0000 0000 0000 0000 0000 0000 0001 0100 ] 对于正数而言,反码就是原码,即 20
负数:
int a = -5 ;
int b = a << 2 ;
[ 1000 0000 0000 0000 0000 0000 0000 0101 ] -5的原码
[ 1111 1111 1111 1111 1111 1111 1111 1010 ] -5的反码
[ 1111 1111 1111 1111 1111 1111 1111 1011 ] -5的补码
[ 1111 1111 1111 1111 1111 1111 1110 1100 ] a<<2左移2位
将补码转换成原码就可以得到数值,补码转原码和原码转补码一样,上面说过了。
[ 1000 0000 0000 0000 0000 0000 0001 0011 ]
[ 1000 0000 0000 0000 0000 0000 0001 0100 ] 得到a<<2的原码,即 -20
左移n位就相当于乘以2的n次方
无符号的移位只有右移,没有左移。
网友评论