介绍
今天是学习算法的第一天,有很多人说进大厂才需要学这个,但是我觉得这个也算一个技术加强的点吧,找工作时候笔试也会考这个,而且在工作中用算法的效率会高,而且自身对这个也有点感兴趣,所以就打算学这个。现在先介绍一个自己学习算法的思路等等。
- 我个人觉得学习算法不说一天俩天就能学会的,不像大学期末考试那样学个几天就能应付考试,而是像高中做数学,物理那样掌握原理,然后慢慢做题,在做题过程中更加了解原理,所以我打算以几个月时间来学习它
- 每次学完原理,并可以通过自己讲出来的时候,然后就去刷题网站上进行练习,让自己更加巩固,在做题的过程中培养自己的逻辑思维能力
- 要勤写代码,从代码中找到乐趣,并且能够坚持下去
- 对于复习,我觉得要做到一定题量再进行整体复习,而不是频繁复习
下面是今天学习的内容:
二进制和位运算
位的概念
计算机存储信息的最小单位。
计算机所能识别的就是用二进制表示的数字
正数用二进制表示
二进制只能用0和1来表示。逢二进一。就跟十进制的逢十进一原理相同。下面用四位二进制来举例:(其他位补0即可)
比如0:用二进制表示为0000 1:0001
2:0010 其中最后一位是2的0次方,倒数第一位是2的一次方,…
负数用二进制表示
整数的最高位(第一位)是0;而负数的最高位是1
首先先用二进制表示出负数的绝对值,然后先再二进制的基础上-1;然后对其取反就是负数的二进制
已知负数二进制求其负数:先对二进制取反,然后+1,得到的为负数的绝对值,然后添加负号即可
常见的位运算
&:位运算与 有0为0,全1为1
|:位运算或 有1为1,全0为0
^:异或 相同为0,不同为1(这里也可以不用记这8个字,直接进行计算,就是再计算过程中不要向前一位进位即可)
~:取非,就是将二进制0变成1,1变成0
<<:不分有符号无符号,右边补0
对于非负数来说左移n相当于乘以2的n次方
>>:带符号右移,就是看符号位是0还是1,0的话就补0,1的话补1
对于非负数来说右移n相当于除以2的n次方
>>>:不带符号右移,高位都补0
注意:&&和||,逻辑与和逻辑或,相比较与位运算与,位运算或具有短路效果
打印二进制的函数
public static void getBinary(int num){
for (int i = 31; i >= 0; i--) {
System.out.print((num & (1 << i)) == 0 ? "0" : "1");
}
System.out.println();
}
相反数
a的相反数 = (~a) + 1;
最小负数相反数还是它自身
为什么这样设置二进制(负数)
让其加法逻辑还是原来的那套逻辑,没有条件转移,在负数与任何数做加法时结果依然正确
溢出
自己确保自己的调用所得到的结果不会溢出,一定是自己确保的,计算机不会给你做检查