JAVA二进制详解

来源:互联网 发布:Js 中isinfinite 编辑:程序博客网 时间:2024/06/06 20:47

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.  50n =m <<1   00000000  00000000  00000000  01100100.  100n =m <<2   00000000  00000000  00000000  11001000.  200

经典面试题:
优化表达式: n * 9
答案: n<<3

数学右移运算:
计算结果:移动一次是数字除2,溢出时候小方向取整数的结果
移位时候:正数高位补0,负数高位补1

Case:m =         00000000  00000000  00000000  00110010.  50n =m >>1   000000000  00000000  00000000  0110010.  25n =m >>2   0000000000  00000000  00000000  110010.  12(往小方向取整)m =         11111111  11111111  11111111  11001100.  -52n =m >>1   111111111  11111111  11111111  1100110.  -26n =m >>2   1111111111  11111111  11111111  110011.  -13n =m >>3   11111111111  11111111  11111111  11001.  -7

和>>的区别:
:无论正负,高位都补0,用于逻辑计算
:工作中实际运用率较高
: 整数高位补0,负数高位补1,结果满足数学规律,用于数学计算

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 左腿神经损伤夏天脚冰凉怎么办 给区组织部的介绍信给到社区怎么办 被丈夫和儿子强送精神病院怎么办 练车穿短袖晒的胳膊特别黑怎么办 车子卖了对方迟迟不过户怎么办 成都华西医院就诊卡密码忘了怎么办 资阳办健康证怎么办要预约吗 头发出油厉害怎么办民间小偏方 你帮助别人别人却想着害你怎么办 怀孕接触有辐射的东西回怎么办 苹果手机用久了有点卡怎么办 4s店把我车撞了怎么办 长安之星2代大灯高不聚光怎么办 被电动车撞了人跑了怎么办 车被电动车撞了对方跑了怎么办 房子卖了户口没地方迁怎么办 酷派大神f2开不开机怎么办 酷派手机玩游戏竖屏怎么办 身上起红疙瘩很痒怎么办越挠越多 苹果6s指纹解锁坏了怎么办 案子结了网上追逃的怎么办 贷款买的手机不还了会怎么办 支付宝手机号没用了登陆不了怎么办 支付宝绑定的手机号注销了怎么办 考勤机进水了不能识别指纹怎么办? 网商银行人脸识别失败怎么办 电脑网页上的字变小了怎么办 把光驱换成固态硬盘后不识别怎么办 相机内存卡电脑读不出来怎么办 sd卡在电脑上无法格式化怎么办 内存卡突然读不出来了怎么办 怀孕两个月胎儿死在腹中怎么办 香港公司在大陆卖地皮资金怎么办 结婚证上的身份证号码错了怎么办 身份证快过期了人在外地怎么办 邮政电话银行登录密码忘记了怎么办 如果欠了3w不敢和家里说怎么办 大四学生欠了3w该怎么办 房子付了首付贷款贷不下来怎么办 浙江嵊泗人在金华丢了身份证怎么办 一证5号够了怎么办新卡