前言
-🏀大家好,我是BXuan,热爱编程与篮球的软件工程大二学生一名
-📚当爱上Coding&&Studying的那一刻…
-🏃放弃不难,但坚持一定很酷。
一、计算机基础概念
1️⃣机器数
机器数:即是有符号的二进制数,0表示正数,1表示负数
+5:计算机字长为8位,二进制数:00000101
-1:计算机字长为8位,二进制数:10000101(原码)
2️⃣真值
由于机器数第一位表示的是符号位,所以其形式值不是真值的数值。
例如1000101表示的是-5而不是133(1000101的十进制是133,前提是第一位不是符号位),因此,-5才是机器数的真值。
3️⃣原码
原码是一种计算机中的数字的二进制的定点表示方法。
原码表示法在数值的前一位增添了一位符号位,0表示正数,1表示负数。(即平时所说的第一位表示符号位,即有符号数)
[+5] = [00000101](原码)
[-5] = [10000101](原码)
注意:因为第一位表示的是符号,所以8位数的二进制的取值范围时[-127,127]。
无符号数(即是第一位不表示符号),其8位数的二进制的取值范围时[0,256]。
4️⃣反码
反码的表示方法:
-
正数的反码是其本身
-
负数的反码是在原码的基础上,符号位不变,其余全部取反
[+5] = [00000101](正数的反码是其本身)
[-5] = [11111010](负数:除符号位不变,其余全部取反)
5️⃣补码
在计算机系统中,数值统一用补码来表示和存储。
原因:使用补码,可以将符号位和数值域统一处理,同时加法与减法也可以统一处理。
补码的表示方法:
-
正数的补码就是其本身
-
负数的补码表示方法就是在原码的基础上,除符号位不变外,其余全部取反,最后加一。
[+5] = [00000101](原码) = [00000101](反码) = [00000101](补码)
[-5] = [10000101](原码) = [11111010](反码) = [11111011](补码)
二、java位运算
位移操作:(只针对 int类型的数据有效,java中,一个int的长度始终是32位,也就是4个字节,它操作的都是该整数的二进制数).
当然也可作用于以下类型,即 byte,short,char,long(它们都是整数形式)。当为这四种类型时,JVM会先把它们转换成int型再进行操作。
1️⃣左移(<<)
m << n的含义:将整数的二进制数左移n位,高位移出n位都舍弃,低位补0;(会出现正数变负数的操作)
eg:
5<<2 :把十进制的数值5左移两位,按如下步骤计算,
把5转位16位的二进制机器数:00000000 00000000 00000000 00000101
按左移原理,将二进制数左移两位:00000000 00000000 00000000 00010100
左移后结果为20
5<<29:把十进制的数值5左移29位,按如下步骤计算,
把5转位16位的二进制机器数:00000000 00000000 00000000 00000101
按左移原理,将二进制数左移29位:10100000 00000000 00000000 00000000
左移后高位是1,结果显然是负数。
小结:m<<n在没有数字溢出的情况下,对于正数和负数,左移n位都相当于m乘以2的n次方。
2️⃣右移(>>)
m>>n的含义:将整数的二进制数右移n位,低位移出n位都舍弃,高位补0;
eg:
5>>2 :把十进制的数值5右移两位,按如下步骤计算,
把5转位16位的二进制机器数:00000000 00000000 00000000 00000101
按右移原理,将二进制数左移两位:00000000 00000000 00000000 00000001
右移后结果为1
-5>>2:把十进制的数值-5右移两位,按如下步骤计算,
把-5转位16位的二进制机器数:11111111 11111111 11111111 11111011
按右移原理,将二进制数右移两位:11111111 11111111 11111111 11111110
右移后结果为-2
小结:m>>n即相当于m除以2的n次方,得到有以下两种情况:
-
整数:即为结果
-
小数:
-
正数:会直接舍弃小数位,整数直接返回。
-
负数:舍弃小数位,整数部分+1返回。
-
3️⃣无符号右移(>>>)
m>>>n:整数m表示的二进制小数,不论正负数,高位都补0;
eg:
5>>>2 :把十进制的数值5右移两位,按如下步骤计算,
把5转位16位的二进制机器数:00000000 00000000 00000000 00000101
按右移原理,将二进制数左移两位:00000000 00000000 00000000 00000001
右移后结果为1
-5>>>2:把十进制的数值-5右移两位,按如下步骤计算,
把-5转位16位的二进制机器数:11111111 11111111 11111111 11111011
按右移原理,将二进制数右移两位:00111111 11111111 11111111 11111110
右移后结果为正数
4️⃣按位非操作(~)
~表示按位取反操作符,对每个二进制的内容取反,即1变0,0变1;
eg:
-
把-5转位16位的二进制机器数:11111111 11111111 11111111 11111011
-
~(-5) 取反结果:00000000 00000000 00000000 00000100
-
转为十进制,结果为4
5️⃣按位与操作(&)
& 位与操作符,对应的二进制位进行与操作,两个都为1才为1,其他情况均为0。
1&0=0
0&0=0
1&1=1
0&1=0
eg:
-5 & 4
-5的二进制形式为: 11111111 11111111 11111111 11111011
4的二进制形式为: 00000000 00000000 00000000 00000100
——————————————————————————————
逻辑与运算结果: 00000000 00000000 00000000 00000000
最终结果为0。
6️⃣按位或操作(|)
| 位或操作符,对应的二进制位进行或操作,两个都为0才为0,其他情况均为1。
1|0=1
0|0=0
1|1=1
0|1=1
eg:
-5 | 4
-5的二进制形式为:11111111 11111111 11111111 11111011
4的二进制形式为:00000000 00000000 00000000 00000100
————————————————————————————
逻辑或运算结果: 11111111 11111111 11111111 11111111
最终结果为-1。
利用或的原理可以将字节转化成整数,-64|0xFF = 192,其中0xFF表示整数255。
7️⃣按位异或操作(^)
^ 异或操作符,相同位值为0 否则为1。
1^1=0
1^0=1
0^1=1
0^0=0
eg:
-5 ^ 4
-5的二进制形式为:11111111 11111111 11111111 11111011
4的二进制形式为:00000000 00000000 00000000 00000100
————————————————————————————
逻辑异或运算结果: 11111111 11111111 11111111 11111111
最终结果为-1。
重点:异或操作有个重要的作用就是判断两个数值是否相等,如6^6=0;