1. 原码
数字在计算机中是以二进制表示的,源码就是将十进制转化为二进制,十进制是逢十进一,同理二进制是逢二进一。
先来一个十进制,对应一个二进制表示:
7:0111
6:0110
源码如此简单,仿佛在侮辱我的智商,不看劝退...
没那么简单,来看个负数:带符号的二进制(第一位为符号位1表示负数)
-7:1111
-6:1110
再来个加法运算:
1+1=2:0001(1)+0001(1)=0010(2)
2+3=5:0010(2)+0011(3)=0101(5)
3+(-1)=2:0011(3)+1001(-1)=1100(-4)
2+(-5)=(-3):0010(2)+1101(-5)=1111(-7)
1+(-1)=0:0001(1)+1001(-1)=1010(-2)
黑人大问号????负数运算怎么没一个对的,机器果然没脑子,接下来让我们给它赋予智慧--反码
2. 反码
正数的反码还是等于原码,负数的反码就是他的原码除符号位外,按位取反。
举个栗子:
数字 原码 反码
3 0011 0011
5 0101 0101
-3 1011 1100
-5 1101 1010
再来做个加法运算:
1+1=2:0001(1)+0001(1)=0010(2)
2+3=5:0010(2)+0011(3)=0101(5)
2+(-5)=(-3):0010(2)+1010(-5)=1100(1011)(-3)
1+(-1)=0:0001(1)+1110(-1)=1111(1000)(0)
3+(-1)=2:0011(3)+1110(-1)=0001(0110)(6)
(-1)+(-1)=(-2):1110(-1)+1110(-1)=1100(1011)(-3)
后两个相加还是不对,看来反码也不太靠谱,科学是非常严谨的,绝不能容忍这种不靠谱的事情发生,于是补码这种东西就应用而生了。
3. 补码
学习了大神的概念用‘模’和‘同余’的概念解释补码。模就是一个周期,下面是参考别人的例子:
补码概念的解释
补码实例
如果这两个截图还不太明白请移步大神的原文,传送门
计算补码的方法:
法1. 正数的补码等于他的原码,负数的补码等于反码+1。
法2. 负数的补码等于他的原码自低位向高位,尾数的第一个‘1’及其右边的‘0’保持不变,左边的各位按位取反,符号位不变。
4. <
eg: 00000101(5)<<1=00001010(10)左移一位相当于2;左移两位相当于2^2==*4
5. >>运算(二进制右移,正数高位补0,负数高位补1)
eg: 00000101(5)>>1=00000010(2)
00000111(7)>>1=00000011(3)
00001010(10)>>1=00000101(5)
发现没结果是除以2的n次方向下取整
6. >>>运算(无符号右移,逻辑右移,无论正负,高位补0)
正数与>>运算结果相同
负数就不一定了
来一段Java源代码,这样就读的懂了
参考:
1. https://blog.csdn.net/afsvsv/article/details/94553228
2. https://www.cnblogs.com/chuijingjing/p/9405598.html