今天准备重新再研究一下繁体字排序的问题,发现涉及到的原码、反码、补码问题,以及Byte与Bit等小细节上,有点小小的阻碍,这里先把这些比较零散的,易混淆的几个概念理理清楚,作一下总结好了。
一、java中按位取反~运算符的计算方法:
数在计算机中是以二进制形式表示的。
数分为有符号数和无符号数。
原码、反码、补码都是有符号定点数的表示方法。
一个有符号定点数的最高位为符号位,0是正,1是副。
以下都以8位整数为例,
原码就是这个数本身的二进制形式。
例如
0000001 就是+1
1000001 就是-1
正数的反码和补码都是和原码相同。
负数的反码是将其原码除符号位之外的各位求反
[-3]反=[10000011]反=11111100
负数的补码是将其原码除符号位之外的各位求反之后在末位再加1。
[-3]补=[10000011]补=11111101
一个数和它的补码是可逆的。
为什么要设立补码呢?
第一是为了能让计算机执行减法:
[a-b]补=a补+(-b)补
第二个原因是为了统一正0和负0
正零:00000000
负零:10000000
这两个数其实都是0,但他们的原码却有不同的表示。
但是他们的补码是一样的,都是00000000
特别注意,如果+1之后有进位的,要一直往前进位,包括符号位!(这和反码是不同的!)
[10000000]补
=[10000000]反+1
=11111111+1
=(1)00000000
=00000000(最高位溢出了,符号位变成了0)
二、Bit与Byte的区别:
Bit意为“位”或“比特”,是计算机运算的基础,属于二进制的范筹;
Byte意为“字节”,是计算机文件大小的基本计算单位;
这两者应用的场合不同。通常用bit来作数据传输的单位,因为物理层,数据链路层的传输对于用户是透明的,而这种通信传输是基于二进制的传输。在应用层通常是用byte来作单位,表示文件的大小,在用户看来就是可见的数据大小。比如一个字符就是1byte,如果是汉字,则是2byte。
下面是2个具体应用实例:
Mbps=mega bits per second(兆位/秒)是速率单位,
MB=mega bytes(兆比、兆字节)是量单位,1MB/S(兆字节/秒)=8MBPS(兆位/秒)。
我们所说的硬盘容量是40GB、80GB、100GB,这里的B指是的Byte也就是“字节”。(与容量相关,应用层)
1 KB = 1024 bytes =2^10 bytes
1 MB = 1024 KB = 2^20 bytes
1 GB = 1024 MB = 2^30 bytes
USB2.0标准接口传输速率是480兆位/秒,即480MBps。这里的B指是的Bit也就是“位”。(与传输相关,底层)
注:另外,Byte通常简写为B(大写),而bit通常简写为b(小写)。可以这么记忆,用大写的就是数据值比较大的位,而小字的就是数据值比较小的字节,1B=8b。