1、什么是二进制?
计算机内存中只有二进制,任何数据都需要转换为2进制才能计算处理
2、十进制
逢十进一,99进位连续进两位,以此类推
数字: 0 1 2 3 4 5 6 7 8 9
权:10000 1000 100 10 1
基数:10
权是基数的N次幂
3、二进制
逢二进一
数字:0 1
权:…-256-128-64-32-16-8-4-2-1
基数:2
权是基数2的整次幂(0、1、2…)
4、编程语言利用算法支持了10进制到2进制之间的转换
1)Integer.parseInt() 将10进制字符串转换为2进制整数
2)Integer.toString() 将2进制整数转换为10进制字符串
计算机内存中没有10进制整数
大多数情况下10进制到2进制整数的转换会自动完成
如果需要手动将10进制转换为2进制整数的时候,就要需要调用Integer.parseInt()
5、16进制
计算机内部没有16进制
根本用途:16进制用于简写2进制,其中将2进制每4位数简写为1位16进制数
1010 a 1011 b 1100 c 1101 d 1110 e 1111 f
6、补码
补码是一个算法
1)实现了计算机能够处理负数(有符号数)功能
2)Java利用parseInt和toString实现了2进制补码和10进制之间的转换
3)补码是计算机底层处理负数的算法
7、经典面试题目
一个正数溢出以后是负数
错误
溢出的结果不是随机的,溢出比较多可能为正,也可能为负,圆周循环
最大值加1是最小值
正确
8、互补对称公式
一个数的相反数等于这个数的取反加1(对最小值不成立,互补对称公式返回自身)
System.out.println(~8+1)
答案:-8
原理分析:
00000000 00000000 00000000 00001000 8
11111111 11111111 11111111 11110111 ~8 -9
11111111 11111111 11111111 11111000 -8
System.out.println(~100+1)
答案:-100
System.out.println(~-100)
答案:99
9、二进制运算符
~:取反运算
&:与运算
|:或运算
:逻辑右移位运算
:数学右移位别运算
<<:左移位运算
按位与运算 &:
0 & 0 =0
0 & 1 =0
1 & 0 =0
1 & 1 =1
计算规则:将两个2进制数按照位对齐规则,对其的两个数进行&运算
Case:经典计算,掩码(mask)计算,截取了N的后8位数字
m = 00000000 00000000 00000000 11111111
n = 01101010 11011111 00100100 01101011
k = m&n 00000000 00000000 00000000 01101011
—————————————————————————
m = 0xff
n = 0x6adf246b;
JAVA IO流 wrintInt会自动进行拆分
将int拆分为4个byte写入到文件中
1)每次处理一个byte
2)将一个整数保存到文件中:将整数拆分为4个byte,逐一保存到文件中
:逻辑右移位运算
掩码计算和逻辑右移位运算配合可以将整数拆分为4个byte
右移N位,则二进制前面补N个0,后面截取N位消失
Case:
n = 01101010110111110010010001101011
k = n>>>1 00110101011011111001001000110101
p = n>>>2 00011010101101111100100100011010
m= n>>>8 00000000011010101101111100100100
按位或运算 &:
0 | 0 =0
0 | 1 =1
1 | 0 =1
1 | 1 =1
计算规则:对两个数进行 | 运算,有1 则为1
Case:
m = 00000000 00000000 10101100 00000000
n = 00000000 00000000 00000000 11010110
k = m | n 00000000 00000000 10101100 11010110
将4个byte拼接为1个int
b1 = 00000000 00000000 00000000 10110101
b1 = 00000000 00000000 00000000 00101011
b1 = 00000000 00000000 00000000 10110111
b1 = 00000000 00000000 00000000 10011101
n = (b1<<24) | (b1<<24) | (b1<<24) | (b1<<24)
n = 10110101 00101011 10110111 10011101
n = 0xb5 0x2b 0xb7 0x9c
n = 0xb52bb79c
数学左移运算:
移动小数点计算:
m = 41729. 向右移动小数点
n = 417290. 扩大10倍
n = 4172900. 扩大100倍
假设小数点位置不懂,相当于数字向左移动:数字向左移动一次扩大10倍,10进制规律扩大到2进制依然存在
2进制时候,小数点位置不动,数字向左移动,数字向左移动一次扩大2倍
Case:
m = 00000000 00000000 00000000 00110010. 50
n =m <<1 00000000 00000000 00000000 01100100. 100
n =m <<2 00000000 00000000 00000000 11001000. 200
经典面试题:
优化表达式: n * 9
答案: n<<3
数学右移运算:
计算结果:移动一次是数字除2,溢出时候小方向取整数的结果
移位时候:正数高位补0,负数高位补1
Case:
m = 00000000 00000000 00000000 00110010. 50
n =m >>1 000000000 00000000 00000000 0110010. 25
n =m >>2 0000000000 00000000 00000000 110010. 12
(往小方向取整)
m = 11111111 11111111 11111111 11001100. -52
n =m >>1 111111111 11111111 11111111 1100110. -26
n =m >>2 1111111111 11111111 11111111 110011. -13
n =m >>3 11111111111 11111111 11111111 11001. -7
和>>的区别:
:无论正负,高位都补0,用于逻辑计算
:工作中实际运用率较高
: 整数高位补0,负数高位补1,结果满足数学规律,用于数学计算