同学们初学⼆进制的⼏个常见疑问
前⾔
很多⼈学习⼆进制的时候都有思考和向⽼师钻⽜⾓筋过⽂章中的⼏个基础问题,但是很多⽼师并不会或者没有时间给你详细解释和推导,这篇⽂章只是⾃我尝试的⼀些理解路线,希望能够给⼤家⼀点启发。
提⽰:以下是本篇⽂章正⽂内容,下⾯案例可供参考
⼀、原始⼀问:数和进制到底是什么?
数字:数字其实是⼈类发明的⼀种可量化表达的规则,当⼤家都遵循规则的时候,⼈类互相之间的量化沟通就能够实现,彼此之间也能更准确的知道对⽅想表达的量化内容,做到“⼼中有数”。 数字规则,其中⾸要的规则就是进制,我们通常说的数字都是要基于具体的进制,⽣活中没有特殊说明情况下,⼤家默认的都是10进制。
计数规则:从⼩到⼤,从右到左,先试图⽤进制内可以表⽰的符号去表⽰(如10进制是0-9共10个符号,⼆进制是0和1两个符号),当进制内符号不能表达的时候,增加数字的位数,⽐如⼀位10进制最多只能表达到9,超过9就需要增加位数。
取值范围:
⼆进制:1=1;2=10;3=11;4=100;5=101;6=110;7=111;所以byte基本类型需要1个字节共8位⼆进制,最⼤表⽰数为2的8次⽅减去1,但是因为有⼀位需要作为符号位,所以最⼤表⽰数为2的7次⽅-1;
⼗进制:9=9;10=10;11=11;19=19;99=99;100=100;所以最⼤三位数为999,即10的3次⽅-1;
⼆、java基本类型int为什么负数的绝对值⽐正数⼤?
因为0放在了正数来表⽰,0⽤⼆进制表⽰为0...0,32个0;
三、为什么负数为⼆进制数按位取反再加1(即补码)?
为了位运算的同⼀规则和运算效率。所有的运算其实最后都是转换为⼆进制的位运算,如取反~,左移《,右移》,⽆符号右移>>>,按位与&,按位或|,按位异或^(相同为0不同为1) 。所以负数定为取反+1是为了所有的加减乘除都能够适⽤于⼀套⼆进制运算规则,⽽⽆需考虑是正数相加,还是负数相加,⼜或者是正数加负数,⽆需设计三条分⽀,能够适⽤于同⼀套位运算规则,增加运算速度,例如取相反数,⽆论正负数取相反数的时候⼆进制位的运算规则都是按位取反再加1,即:-x=~x+1,推导公式见下⽅例⼦推导。
带符号右移>>:右移后,左边⽤符号位补齐;
不带符号右移>>>:右移后,左边⽤0补齐;
相反数的⼆进制表达:-x=~x+1,注意,最⼩负数的相反数是它⾃⼰,0取反后也是它⾃⼰
例⼦推导:
1 —》0+1=-(0+1)=-1=-1;
负数二进制补码运算法则公式推导:
1)假设x是正数,⼆进制记做:0a,那么0a按位取反得到1b,a和b都是31位⼆进制且互反;
2)因为1b第⼀位是1,即是负数,根据负数的定义1b=-(0a+1)=-0a-1;
3)因为0a=x,所以x按位取反=~x=1b=-(0a+1)=-0a-1=-x-1;
4)所以-x=~x+1;
5)假设x是负数1a,证明-1a=0b+1。因为1a=-(0b+1)=-0b-1,所以-1a=0b+1;
总结
⾃⼰的浅薄认识,欢迎指导,不喜勿喷。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。