极客时间 自我提升第六天
今天,菜鸟对昨天写的趣谈linux操作系统进行了修改,才让自己感觉算是心安理得,毕竟极客讲得不好,但是我给读者的必须是完美的才好。而安装好JDK之后,菜鸟就迫不及待的上手了,而第二天差的程序员的数学基础课也是正好要用java写,所以就直接用我的Linux服务器了(其实是菜鸟完全忘记怎么使用eclipse了,咳咳咳,不管怎么样,反正Linux没有软件,直接就是命令行,这样就无所谓了),话不多说,直接上,冲冲冲!!!!
程序员的数学基础课
基础思想一知识点:
1、明白2进制对于电脑的意义,首先请回答这个问题(菜鸟在以前学计算机组成原理时就已经回答了这个问题)
计算机为什么使用二进制?而不是十进制?
这里就直接引用极客时间的老师的话了:
我觉得,计算机使用二进制和现代计算机系统的硬件实现有关。组成计算机系统的逻辑电路通常只有两个状态,即开关的接通与断开。
断开的状态我们用“0”来表示,接通的状态用“1”来表示。由于每位数据只有断开与接通两种状态,所以即便系统受到一定程度的干扰时,它仍然能够可靠地分辨出数字是“0”还是“1”。因此,在具体的系统实现中,二进制的数据表达具有抗干扰能力强、可靠性高的优点。
相比之下,如果用十进制设计具有 10 种状态的电路,情况就会非常复杂,判断状态的时候出错的几率就会大大提高。
另外,二进制也非常适合逻辑运算。逻辑运算中的“真”和“假”,正好与二进制的“0”和“1”两个数字相对应。逻辑运算中的加法(“或”运算)、乘法(“与”运算)以及否定(“非”运算)都可以通过“0”和“1”的加法、乘法和减法来实现。
菜鸟刚准备写,不过感觉除了测试需要用到java代码,其它的都是计算机组成原理里面的东西,什么左移、右移、或、与、异或,这里就不给大家看代码了,直接上结论:
1、左移
(没有溢出时)相当于将数字翻倍
2、右移
二进制右移一位,就是将数字除以 2 并求整数商的操作(对于正数是的,对于负数的是算数右移才行)
这里分为算数右移和逻辑右移:
算数右移:
逻辑右移:
注意:
这里学过计算机组成原理的同学都知道,负数也就是符号位为1的,在计算机中以补码形式存储,而这里举的例子就是用的补码,毕竟正数也没什么好说的,补不补都是0。
这里有的同学会问:为什么没有算数左移和逻辑左移?
由于左移位无需考虑高位补 1 还是补 0(符号位可能为 1 或 0),所以不需要区分逻辑左移和算术左移。
注意
逻辑右移在 Java 和 Python 语言中使用 >>> 表示,而算术右移使用 >> 表示。如果你有兴趣,可以自己编码尝试一下,看看这两种操作符输出的结果有何不同。
在 C 或 C++ 语言中,逻辑右移和算数右移共享同一个运算符 >>。那么,编译器是如何决定使用逻辑右移还是算数右移呢?答案是,取决于运算数的类型。如果运算数类型是unsigned,则采用逻辑右移;而是 signed,则采用算数右移。如果你针对 unsigned 类型的数据使用算数右移,或者针对 signed 类型的数据使用逻辑右移,那么你首先需要进行类型的转换。
3、或
或相当于c语言、js里面的“ || ”(如果没学过这些的读者,那就记下来:同时为0时,或才能为0,否者都是1)
4、与
与相当于c语言、js里面的“ && ”(如果没学过这些的读者,那就记下来:同时为1时,与才能为1,否者都是0)
5、异或
异或就是相异为1,相同为0(这里,有异或自然有同或,而同或正好与异或相反,相异为0,相同为1)
小结:
(这里附上极客时间的小结,感觉这个小结还不错,告诉了我们为什么学二进制,只为更好的服务各位读者朋友,我只会取其精华去其糟粕)
今天我们聊了二进制,你可能会问:学习二进制究竟有什么用呢?平时的编程中,我们好像并没有使用相关的知识啊?确实,目前的高级语言可以帮助我们将人类的思维逻辑转换为使用 0 和 1 的机器语言,我们不用再为此操心了。但是,二进制作为现代计算机体系的基石,这些基础的概念和操作,你一定要非常了解。
二进制贯穿在很多常用的概念和思想中,例如逻辑判断、二分法、二叉树等等。逻辑判断中的真假值就是用二进制的 1 和 0 来表示的;二分法和二叉树都是把要处理的问题一分为二,正好也可以通过二进制的 1 和 0 来表示。因此,理解了二进制,你就能更加容易地理解很多计算机的数据结构和算法,也为我们后面的学习打下基础。