这一讲重点讲清楚2个知识点
1、弄清移位运算和乘除运算的关系
十进制的运算,我们都很熟悉了,那么二进制的运算机制是怎样的呢?
其实,四则运算同样也可以使用在二进制中,要注意每逢2进一位即可。
下面我们来学习二进制特有的运算(计算机特有的运算)
什么是移位运算?
移位运算指的是:将二进制数值的各位数进行左右移位(shift=移位)的运算。
①左移:向高位方向
②右移:向低位方向
案例
图示意思:变量a保存十进制39,将左移两位后的结果保存在变量b中。
对于计算机来说,无论移动的是十进制或者十六进制等,在底层都是转换成二进制来操作的。
上面的案例转换成二进制后移位(左移2位)操作如下
对上图的说明:无论左移还是右移,溢出的最高位或者最低位直接舍弃。
左移空出的最低位用0补,右移空出的最高位后面讲解。
规律:十进制左移后会变成原来的10倍、100倍、1000倍。。。同样的,对于二进制来说,左移后变成原来的2倍、4倍、8倍。。。。
反之,右移后变成原来的1/2 1/4 1/8等,这从侧面也能反映出移位运算能代替除法运算了。
2、补数
补数概念是为了解决计算机中负数的表示方式
那么什么是补数?
二进制表示负数的原则:最高位作为符号位来表示
最高位为0,表示正数
最高位为1,表示负数
说到这儿可能有些人想,按照上面的原则,-1就表示成10000001,正确答案是11111111。
计算机在做减法运算时,内部转换成加法运算的,为此,表示负数时要使用到二进制中的补数,补数就是用正数来表示负数。
计算机中,一个正数-一个负数=一个正数+这个负数的补数
3、如何获取补数?
获取补数的方法:二进制的各数位的数值全部取反,然后将取反后的数加1.
如用8位二进制表示-1时,只需求得1的补数即可。
1-->00000001
00000001取反11111110
11111110+1=11111111
如下图
补数这种思维方式,直观上可能不容易理解,但是逻辑上是很严谨的。
案例1-1=1+(-1)=0
如果把-1表示成10000001,运算结果如下。(错误)
如果把-1表示成11111111,运算结果如下。(正确)
补数求解的变换方式就是取反+1
为什么使用补数后就能正确的表示负数呢?
看下图
运算结果为0
结论:将二进制数的值取反后加1的结果和原来的值相加,结果为0。
注意:当运算的结果为负数时,计算结果也是以补数的形式来表示的。
案例(3-5)
3--00000011
5--00000101
5的补码为11111010+1=11111011
-2用补数表示
2--00000010
2取反11111101
2取反后+1:11111110
4、这一讲我们讲了移位运算和乘除运算的关系和补数,这些知识点对于一个程序员来说,有时候很重要。
明白这些底层机制以后,可以用于代码的优化,提高开发速度等方面。对于非专业人员,了解这些知识可能对你暂时没有用。
但是,如果我们学习什么东西都要追求当前有用,那你的视野可能有些狭隘。
现在很流行的说法是,跨界学习,我所理解的跨界学习是,不要局限于当下,有时候可以学点无用之学,说不定哪天可以在你的领域内解决大问题呢。
下一讲:逻辑右移和逻辑算术右移的区别
![0e0e6c89cef3f75c217e70c639214ae6.png](https://img-blog.csdnimg.cn/img_convert/0e0e6c89cef3f75c217e70c639214ae6.png)
![ddb4cf4eee9736218bf7cc1d2bf9bebd.png](https://img-blog.csdnimg.cn/img_convert/ddb4cf4eee9736218bf7cc1d2bf9bebd.png)
![02815a826756f293d0ae9d8d99fd5321.png](https://img-blog.csdnimg.cn/img_convert/02815a826756f293d0ae9d8d99fd5321.png)
![1ef708b8ca53eda70242d6eacb76cb6d.png](https://img-blog.csdnimg.cn/img_convert/1ef708b8ca53eda70242d6eacb76cb6d.png)
![c8e8968153689cbbfb5663ae09dfaf56.png](https://img-blog.csdnimg.cn/img_convert/c8e8968153689cbbfb5663ae09dfaf56.png)
![c8e8968153689cbbfb5663ae09dfaf56.png](https://img-blog.csdnimg.cn/img_convert/c8e8968153689cbbfb5663ae09dfaf56.png)
![7435721c8190f8201313aca8a4faafff.png](https://img-blog.csdnimg.cn/img_convert/7435721c8190f8201313aca8a4faafff.png)