撸了N久的代码,可是忽然冒出来个位运算,我就蒙蔽了,这是什么?我是谁?我在干什么?我在哪?算法
关于位运算符无非也就 与(&)、或(|)、异或(^)、取反(~)、左移(<<)、右移(>>)、无符号右移(>>>)编码
位运算其实就是二进制的运算,加减乘除适用于十进制,而位运算就是二进制的运算,可是因为咱们的运算都是基于十进制来讲的,因此会有点绕,略微有点难懂,接下来言归正传spa
咱们在编码过程当中应该会了解不少不一样的进制,除去经常使用的十进制,还有二进制、八进制、十六进制,由于咱们的位运算符主要用到二进制,就只讲讲二进制3d
几进制就是一个位上最多能表示几个数,如十进制的个位有0~9十个数字,八进制有0~7八个数字,二进制咱们天然想到就是0~1两个数字blog
咱们编码中最小的单位应该是字节,而一个字节有8位,每一位就是一个0或1,因此一个字节用二进制表示就是get
若是 4&7 那么这个应该怎么运算呢?class
首先咱们须要把两个十进制的数转换成二进制 二进制
4 : 0000 0100im
7 : 0000 0111
在这里要提到一点,1表示true,0表示false
而与运算的时候相同位之间其实就是两个Boolean的运算
全true(1),即为true(1)
全false(0),即为false(0)
一false(0)一true(1),仍是false(0)
以 5|9 为例
5 : 0000 0101
9 : 0000 1001
在作与运算的时候
遇true(1)就是true(1),
无true(1)就是false(0)
以 7^15 为例
7: 0000 0111
15: 0000 1111
在异或的时候
只要相同都是false(0)
只有不一样才是true(1)
例: ~15
一样的先变成二进制:15:0000 1111
这个其实挺简单的,就是把1变0,0变1
注意:二进制中,最高位是符号位 1表示负数,0表示正数
左移就是把全部位向左移动几位
如: 12 << 2 意思就是12向左移动两位
12的二进制是: 0000 1100
经过这个图咱们能够看出来,全部的位全都向左移动两位,而后把右边空的两个位用0补上,最左边多出的两个位去掉,最后获得的结果就是00110000 结果就是48
咱们用一样的办法算 12<<3 结果是 96
8<<4 结果是 128
由此咱们得出一个快速的算法 M << n 其实能够这么算 M << n = M * 2n
这个跟左移运算大致是同样的
例: 12 >> 2
咱们能够看出来右移和左移实际上是同样的,可是仍是有点不一样的,不一样点在于对于正数和负数补位的时候补的不同,负数补1,正数补0
如咱们再作一个 –8 的 -8>>2
这里总结一下,关于负数或者正数来讲,移位的时候是同样的,可是在补位的时候,若是最高位是0就补0,若是最高位是1就补1
由此咱们得出一个快速的算法 M >> n 其实能够这么算 M >> n = M / 2n
无符号右移(>>>)只对32位和64位有意义
在移动位的时候与右移运算符的移动方式同样的,区别只在于补位的时候无论是0仍是1,都补0
这个就不画图了