JAVA二进制详解

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,结果满足数学规律,用于数学计算

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值