位运算
byte类型8位,short类型16,int 类型32位,long类型64位
<< :向左移动做位运算,剩余部分补零,如向左移动1 位(0001 ——> 0010 ) ,左移一位相当于乘2
》》 :右移,带符号右移,左边用符号补齐,负数的话用1补齐,正数用0补齐
》》》:不带符号右移,左边用0补齐
&:与,两个1为1(有0则0),否则都为0,如(1110 和0010 ——>0010)
| :或,有1则1,如(00110和11000 ——> 11110)
1:000000000000000000000001 第一位0表示正数
-1: 11111111111111111111111111111 第一位1表示负数,剩下的31位取反再+1
11111111111111111111111111111
取反
00000000000000000000000000000
+1
00000000000000000000000000001 -> 1
最后加上符号 == -1
1000000000000000000000000000是最小的负数
1是符号位 表示负数,剩下的取反
111111111111111111111111111
再+1,之后要进位
100000000000000000000000000
5的相反数:5 -》 5取反+1
数据结构
所有的数据结构都是由连续和跳转组成的
连续:可以参考数组,但不严禁
跳转:链表、二叉树,数据与数据直接并不是连续在一起的,而是由地址指向的
场景:
有一个数组arr =[11,15,5,3,1,8,69,44,56,741,321],我经常查询数组区间的累加和,如 arr[1,3]区间的值的和思路一:将所有相加的可能性放在一张表中,每次读取区间的值即可,不用再计算了
思路二:将数组的每一个元素和前面元素的和放在新的H[R]数组中,每次取的时候剪掉前面不需要的和即可,H[R]-H[R-1]
——————
对比:①比②多占用n(数组长度)倍空间,但②需要取两次数据并且做一次运算