
自我感受
最近在找工作,有一点感受是基础很重要,很重要,能不能走得远,能否走多远,还是在于地基是否稳固,当然还有思维逻辑,知识体系,交流沟通(以后再聊),于是重新拾起了Java基础,纪录一下,巩固一下。
1 原码、反码、 补码
数据类型
- 在Java虚拟机中整数有byte、short、int、long四种分别表示 8位、16位、32位、64位有符号整数
机器数
- 一个数在计算机中的二进制表示, 机器数是带符号的,用一个数的最高位存放符号, 正数为0, 负数为1。
比如,十进制中的数3 ,转换成二进制就是00000011,如果是 -3 ,就是 10000011
真值
- 第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)
1.1 原码
原码就是符号位加上数字的二进制表示,第一位表示符号 (0正数 1负数)
+7的原码为: 00000111
-7的原码为: 10000111
1.2 反码
一个数如果为正,则它的反码与原码相同;一个数如果为负,则符号位为1(符号位不变化,其余位数取反)
+7的反码为:00000111
-7的反码为:11111000
1.3 补码
在计算机中没有原码,反码的存在,只有补码,补码参与实际运算
补码:一个数如果为正,则它的原码、反码、补码相同;一个数如果为负,去到反码然后加1(反码加1就是补码)
+7的补码为: 00000111
-7的补码为:11111001
-10求补码步骤(int)
-10的原码: 10000000 00000000 00000000 00001010
-10的反码: 11111111 11111111 11111111 11110101
-10的补码: 11111111 11111111 11111111 11110110
1.4 计算机中补码参与实际运算
1用原码计算10-10
0000 1010 (10的原码)
+ 1000 1010 (-10的原码)
1001 0100 (结果为:-20)
2>使用反码计算10-10
0000 1010 (10的反码)
+ 1111 0101 (-10的反码)
1111 1111 (结果为:-0)
3>使用补码计算10-10
0000 1010 (10的补码)
+ 1111 0110 (-10的补码)
1 0000 0000 (结果为:0)
1.5 总结
- 正数:它的原码、反码、补码相同
- 负数:反码 符号位不变化,其余位数取反,补码 符号位不变化其余各位原码取反(反码)+1==(反码+1)
2 逻辑运算符
"<<" 表示左移,不分正负数,低位补0
正数:r = 20 << 2
20的二进制补码:0001 0100
向左移动两位后:0101 0000
结果:r = 80
负数:r = -20 << 2
-20 的二进制原码 :1001 0100
-20 的二进制反码 :1110 1011
-20 的二进制补码 :1110 1100
左移两位后的补码:1011 0000
反码:1010 1111
原码:1101 0000
结果:r = -80
">>" 表示右移,如果该数为正,则高位补0,若为负数,则高位补1
正数:r = 20 >> 2
20的二进制补码:0001 0100
向右移动两位后:0000 0101
结果:r = 5
负数:r = -20 >> 2
-20 的二进制原码 :1001 0100
-20 的二进制反码 :1110 1011
-20 的二进制补码 :1110 1100
右移两位后的补码:1111 1011
反码:1111 1010
原码:1000 0101
">>>表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0"
正数: r = 20 >>> 2
的结果与 r = 20 >> 2 相同
负数: r = -20 >>> 2
注:以下数据类型默认为int 32位
-20:原码:10000000 00000000 00000000 00010100
反码:11111111 11111111 11111111 11101011
补码:11111111 11111111 11111111 11101100
右移:00111111 11111111 11111111 11111011
结果:r = 1073741819
"^” 位异或运算
- 运算规则是:两个数转为二进制,然后从高位开始比较,如果相同则为0,不相同则为1。
8^11
0000 1000
+ 0000 1011
0000 0011 (结果为:3)
"&" 位与运算符
- 运算规则:两个数都转为二进制,然后从高位开始比较,如果两个数都为1则为1,否则为0。
= 8&11
0000 1000
+ 0000 1011
0000 1000 (结果为:8)
"|" 位或运算符
- 运算规则:两个数都转为二进制,然后从高位开始比较,两个数只要有一个为1则为1,否则就为0。
8|11
0000 1000
+ 0000 1011
0000 1011 (结果为:11)
"~" 位非运算符
~37
补码 0010 0101
取反,高位变 1101 1010
取反,高位不变 1010 0101
+1 1010 0110 (值:-38)
本文使用 mdnice 排版