所有数字在计算机底层都是以二进制的形式存在。
进制的四种表达形式:
进制之间的相互换算参考:https://xinzhi.wenda.so.com/a/1537180588200142
在Java中的整数,默认是int类型占4字节,占32bit(1字节等于8bit),其第32位是符号位;long类型占8个字节,占64bit,其第64位是符号位。
比如:int整数8的二进制:00000000 00000000 00000000 00001000,最多不超过32位。
注意:符号位,0表示正,1表示负。
二进制整数的三种形式:
注意:正数的原码、反码和补码都相同。补码转原码是补码取反+1
为什么要使用原码、反码和补码的表示形式?
答:计算机辨别“符号位”会让计算机的基础电路设计变得复杂,于是人们想到将符号位也参与运算,我们知道根据运算法则,减去一个整数等于加上一个负数,所以机器可以只有加法没有减法,这样计算机运算的设计就简单了。(在计算机中,都是补码参与计算)
为什么正数的原码、反码和补码相同?
答:反码和补码的出现是用来解决做减法问题,通过加负数的方式达到做减法的效果,所以只有负数才有反码和补码,正数没有,所有正数的反码和补码都是本身(原码)。
例:演示在计算机中如何计算1+(-1)= 0的过程
整数二进制转换:
1:00000000 00000000 00000000 00000001
-1:10000000 00000000 00000000 00000001
补码转换:
1:00000000 00000000 00000000 00000001(补码)
-1:11111111 11111111 11111111 11111110(反码)-> 11111111 11111111 11111111 11111111(补码)
说明:二进制相加,逢二进一。
00000000 00000000 00000000 00000001
+ 11111111 11111111 11111111 11111111
----------------------------------------
100000000 00000000 00000000 00000000 -> 00000000 00000000 00000000 00000000 = 0
注:最高位超出位数直接被舍弃,最后计算结果为0.
位运算是对补码的操作。运算完后,需要将补码转回原码再转十进制,才是最后运算结果,由于正数的补码和原码相同,就不需要转,负数需要转。
注意:
运算符:<<
说明:整数的二进制数向左移动指定位数。
示例:1 << 2 = 4
补码转换:
1:00000000 00000000 00000000 00000001
1向左位移2位(1<<2)
00000000 00000000 00000000 00000001
<< 00000000 00000000 00000000 00000001
----------------------------------------
00000000 00000000 00000000 00000100 = 4
注:左位移后,左边超出部分舍弃,右边用0补齐。
运算符:>>
说明:整数的二进制数向右位移指定位数。
示例:8>>2 = 2
补码转换:
8:00000000 00000000 00000000 00001000
-8:10000000 00000000 00000000 00001000 (取反)-> 11111111 11111111 11111111 11110111 (+1)-> 11111111 11111111 11111111 11111000
8向右位移2位
00000000 00000000 00000000 00001000
>> 00000000 00000000 00000000 00001000
------------------------------------------
0000000000 00000000 00000000 000010 = 2
注:右位移后,左边用0补齐,右边超出部分舍弃。
-8向右位移2位
11111111 11111111 11111111 11111000
>> 11111111 11111111 11111111 11111000
------------------------------------------
11111111 11111111 11111111 11111110 (取反)-> 10000000 00000000 00000000 00000001 (+1)-> 10000000 00000000 00000000 00000010 = -2
注:运算后得到的是补码需转成原码。
运算符:>>>
说明:整数的二进制数向右位移指定位数,正数用0补齐,负数用1补齐。
示例:
8>>>2 = 2
-8>>>2 = 1073741822
补码转换:
8:00000000 00000000 00000000 00001000
-8:10000000 00000000 00000000 00001000 (取反)-> 11111111 11111111 11111111 11110111 (+1)-> 11111111 11111111 11111111 11111000
8无符号向右位移2位
00000000 00000000 00000000 00001000
>>> 00000000 00000000 00000000 00001000
------------------------------------------
0000000000 00000000 00000000 000010 = 2
-8无符号向右位移2位
11111111 11111111 11111111 11111000
>>> 11111111 11111111 11111111 11111000
------------------------------------------
00111111 11111111 11111111 11111110 = 1073741822
注:无符号右位移,左边用0补齐,右边超出部分舍弃。
在线二进制转换十进制:https://www.jisuan.mobi/KZn.html
运算符:~
运算规则:~1=0; ~0=1,1变0,0变1。
示例:~3 = -4
补码转换:
3:00000000 00000000 00000000 00000011
3取反
~ 00000000 00000000 00000000 00000011
-------------------------------------
11111111 11111111 11111111 11111100 (取反)-> 10000000 00000000 00000000 00000011 (+1)-> 10000000 00000000 00000000 00000100 = -4
运算符:&
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1,只有同时都是1的时候才是1,否则是0。
示例:3 & 5 = 1
补码转换:
3:00000000 00000000 00000000 00000011
5:00000000 00000000 00000000 00000101
3按位与5
00000000 00000000 00000000 00000011
& 00000000 00000000 00000000 00000101
-------------------------------------
00000000 00000000 00000000 00000001 = 1
运算符:|
运算规则:0 | 0=0; 0 | 1=1; 1 | 0=1; 1 | 1=1,任意一方是1就是1,否则是0。
示例:3 | 5 = 7
补码转换:
3:00000000 00000000 00000000 00000011
5:00000000 00000000 00000000 00000101
3按位或5
00000000 00000000 00000000 00000011
| 00000000 00000000 00000000 00000101
-------------------------------------
00000000 00000000 00000000 00000111 = 7
运算符:^
运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0,相同的值为0,不同的值为1。
示例:3^5 = 6
补码转换:
3:00000000 00000000 00000000 00000011
5:00000000 00000000 00000000 00000101
3按位异或5
00000000 00000000 00000000 00000011
^ 00000000 00000000 00000000 00000101
---------------------------------------
00000000 00000000 00000000 00000110 = 6