java基础-位运算

这里又涉及到了java的基础类型
一、4种整型
byte 1字节 -128——127
short 2 字节 -32,768 —— 32,767
int 4 字节 -2,147,483,648 ——2,147,483,647(超过20亿)
long 8 字节 -9,223,372,036,854,775,808——9,223,372,036854,775,807
注释:java中所有的数据类所占据的字节数量与平台无关,java也没有任何无符号类型
二、 2种浮点类型
float 4 字节 32位IEEE 754单精度(有效位数 6 – 7位)
double 8 字节 64位IEEE 754双精度(有效位数15位)
三、1种Unicode编码的字符单元
char 2 字节 整个Unicode字符集
四、1种真值类型
boolean 1 位 True或者false

负数的表示方法,有三种
1、 原码表示法
负数符号位1,随后是二进制数的绝对值。
如(-45)的原码=(10101101)

2、 反码表示法
负数符号位为1,随后将每位二进制取反。
如(-45)反码=(11010010)
可见反码表示的负数相当于将其对应的正数(连同符号位)按位取反得到。

3、 补码表示法
负数符号位为1,随后是二进制的补码。补码通过反码加1得到。
如(-45)补码=(11010011)


java采用了二进制的补码方法来表达负数,我们以java api的UrlEncoder UrlDncoder
为例讲解(可以直接阅读源代码了解)
1.移位
(ba[j] >> 4) & 0xF
向右位移4位,然后再和16进制表示的数字15进行与运算
如果ba是负数,并且是byte类型,占用8位,则需要转换成负数的表示方法
比如-42,最高位1表示负数,0表示正数
第一步 1010 1010 42 原码 均带有符号位
第二步 1101 0101 取反 反码 均带有符号位
第三步 1101 0110 低位加1 -42 补码 均带有符号位
第四步 1000 1101 位移4位 变成整数13了,前面带有符号位1,表示负数
第五步 1000 1101
0000 1111
0000 1101 作与运算 得到最终结果 13
十六进制表示为D

ba[j] & 0xF
第一步 1010 1010 42 原码 均带有符号位
第二步 1101 0101 取反 反码 均带有符号位
第三步 1101 0110 低位加1 -42 补码 均带有符号位
表示负数
第四步 1101 0110
0000 1111
0000 0110 和F作与运算 得到最终结果 6
十六进制表示为6


其中D6表示了GBK汉字“中”编码的
D6D0的双字节中的高位字节。

java中有几种位移运算符号
<<(左移)、>>(带符号右移)和>>>(无符号右移)
带符号的意思是位移操作后,最高位还是要把原来的符号位带上,如果是负数则最高位为1,是正数则最高位位0
当超出byte的位数的时候,就变成了取该数的补数
比如137,
10001001
由于 用byte表示就应该是负数
所以对其取反求补数
10001001 原码
01110110 反码
01110111 补码

因为其是负数,所以最终表示的是
11110111 就是-119


我们再来看看java api中的
UrlEncoder 代码中的
byte[] ba = str.getBytes(charset);
char ch = Character.forDigit((ba[j] >> 4) & 0xF, 16); 取高位 用16进制表示
ch = Character.forDigit(ba[j] & 0xF, 16); 取低位用16进制表示

UrlDecoder代码中的
int v = Integer.parseInt(s.substring(i+1,i+3),16);
就是将d6转成整形 ,然后再转成byte
bytes[pos++] = (byte) v;
最后将字节转换成相应编码的字符串,就完成了 整个解码过程
sb.append(new String(bytes, 0, pos, enc));


说白了,编码就是将编码后的字节高低位用16进制表示
解码就是将编码后的16进制转换成10进制数,然后再用字节表示,
还原后的字节再用编码生成相应的字符串

这就是整个url编码解码的过程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值