位运算是把数值转化为01来进行计算的,更贴近计算机底层。
位运算主要是:按位与(&),按位或(|),按位异或(^),左移(<<),右移(>>),取反(~)这六种。下面我们一一来讨论。
既然位运算是把数值转化为二进制,那么首先需要学会转化。
一个整数一个负数分别举例。
234转化为二进制:
234=128+64+32+8+2=1110101
加上一个符号位那就是:01110101
-156转化位二进制:
首先转化负数的绝对值
156=128+16+8+4=1001110
然后各位取反,末位加一
1001110
~
---------
0110001
+ 1
---------
0110010
再加上一个符号位:
10110010
先从最简单的取反说起吧:
取反在把负数转化为二进制的时候已经用到了。
就是把每一位都取反,1换成0 ,0换成1,比如10010取反如下:
10010
~
-------
01101
按位与(&)
按位与把二进制的每一位对应进行与操作。举例说明:
10010 & 01010
10010
& 01010
---------
00010
按位或(|)
按位进行或操作,举例说明:
10010 | 01010
10010
|01010
-------
11010
按位异或(^)
异或就是如果两个对应的位不相同的取1,相同取0
10010 ^01010
10010
^ 01010
---------
11000
左移以及右移
左移几位就是把数字整体向左移动几位,后边补0,移动几位乘以2的几次方。右移就是除以2的几次方,前边补0.
比如 10010 >>2 , 10010<<2
10010
>>2
---------
00100
10010
<<2
---------
01000
当然在整数计算的时候需要先把整数转化为二进制。
来用左移算一道题:
123 * 243
123 * 243 = 123 * 128 +123 * 64 + 123 * 32 + 123 * 16 + 123 *2 +123 * 1
=123<<7 + 123 <<6 + 123 <<5 + 123 <<4 + 123 <<1 + 123
这样算起来是不是简单多了。