不仅限于Java 我们必须要了解的Java位运算

基本概念1、当前常见的CPU位数是32位和64位,所谓32位处理器就是一次只能处理32位,也就是4个字节的数据,而64位处理器一次则能处理64位,即8个字节的数据 。
2、一字节(1Byte)等于8位(8bit),位是计算机存储数据的最小单位,也就是计算存储的数据是一系列二进制位信息 。每个位用0或1表示 。(大B和小b的区别需注意哦)
3、为什么一个字节是8位?
现在通用的说法是8位可以涵盖所有的字符编码,即ASCII编码 。但历史上也存在过4位或者7位为1Byte的场景,只是在后续的字符集标准统一中逐渐被8bit所替代 。除了历史原因之外,还有数据存储的需要(必须要能在一个字节内表示超过100种状态,包括常用数字,大小写字母等),再加上早期计算机存储价格昂贵,所以8bit也是在当时符合二进制特性的必然结果 。
4、二进制加减运算,加法:0+0=0,0+1=1,1+0=1,1+1=10 ,逢2进1 。
5、二进制转十进制及十进制转二进制 。
上述列出了一些基本概念和对应的可参考链接,建议先优先了解一下 。尤其是二进制和十进制的互相转换以及二进制的加减法规则,在后面都会具体涉及到 。
机器数、真值人类用十进制完全是因为我们有10个手指头 。如果有一天你看到一个外星人,它只有4个手指头,那么他使用的一定是四进制,如图所示:

不仅限于Java 我们必须要了解的Java位运算

文章插图
 
如果能看明白上图,说明你已经明白了进制和手指头的关系了 。现代的计算机内部使用门电路,它们只能表示0或者1两个状态 。如果计算机是一个人,那么他只有两个手指头,所以它使用二进制 。
是的,就是这样,所谓的进制,实际上并不是什么神秘的东西,只是关于数的一种表示方式而已了 。门电路概念
机器数机器数分为:无符号数和有符号数两种 。
一个数在计算机中的二进制表示形式, 叫做这个数的机器数 。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0,负数为1 。
比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011 。
如果是 -3 ,就是 10000011。那么,这里的 00000011 和 10000011 就是机器数 。
真值因为第一位是符号位,所以机器数的形式值就不等于真正的数值 。
例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131) 。
所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值 。
例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1
原码、反码、补码为了妥善的处理数据运算过程中符号位的问题,于是就产生了把符号位和数值位一起编码起来表示相应的数的各种表示方法 。例如我们熟悉的原码、反码、补码、移码等 。通常将未经编码的数称为真值,编码后的数称为机器数或者机器码 。
计算机当前所使用的机器数是采用的补码的方式 。在探求为何机器要使用补码之前, 让我们先了解原码, 反码和补码的概念 。对于一个数, 计算机要使用一定的编码方式进行存储, 原码, 反码, 补码是机器存储一个具体数字的编码方式 。
原码原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:
[+1]原 = 0000 0001[-1]原 = 1000 0001第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:
【不仅限于Java 我们必须要了解的Java位运算】[01111111,11111111]转换为真值后即:
[127,-127 ]原码是人脑最容易理解和计算的表示方式 。原码也可以理解为最原始的机器码 。
反码反码的表示方法是:
正数的反码是其本身,
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反 。
[+1] = [00000001]原 = [00000001]反[-1] = [10000001]原 = [11111110]反可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算 。
补码补码的表示方法是:
正数的补码就是其本身,
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1) 。
[+1] = [00000001]原 = [00000001]反 = [00000001]补[-1] = [10000001]原 = [11111110]反 = [11111111]补对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值 。


推荐阅读