最近在游戏开发中很多地方采用二进制算法极为简便,因而做一次记录:
位运算在很多都是经常会用到的,原始点就从0、1开始。位运算主要包括按位与(&)、按位或(|)、按位异或(^)、取反(~)、左移(<<)、右移(>>)这几种,其中除了取反(~)以外,其他的都是二目运算符,即要求运算符左右两侧均有一个运算量。
1、补码
在总结按位运算前,有必要先介绍下补码的知识,我们知道当将一个十进制正整数转换为二进制数的时候,只需要通过除2取余的方法即可,但是怎么将一个十进制的负整数转换为二进制数呢?其实,负数是以补码的形式表示,其转换方式,简单的一句话就是:先按正数转换,然后取反加1。
1 2 3 4 5 6 7 |
|
2、按位与(&)
参加运算的两个数,换算为二进制(0、1)后,进行与运算。只有当相应位上的数都是1时,该位才取1,否则该为为0。
1 2 3 4 5 6 |
|
由于任何数和1进行按位与结果为1或0,可以通过该运算来判断一个数是否为奇数还是偶数。
技巧:n & (n - 1)将整数n的最后一位为1的位变成0,可以用用来计算二进制中1的个数
3、按位或(|)
参加运算的两个数,换算为二进制(0、1)后,进行或运算。只要相应位上存在1,那么该位就取1,均不为1,即为0。
1 2 3 4 5 6 |
|
4、按位异或(^)
参加运算的两个数,换算为二进制(0、1)后,进行异或运算。只有当相应位上的数字不相同时,该为才取1,若相同,即为0。
1 2 3 4 5 6 |
|
可以看出,任何数与0异或,结果都是其本身。利用异或还可以实现一个很好的交换算法,用于交换两个数,算法如下:
1 2 3 |
|
5、取反(~)
参加运算的两个数,换算为二进制(0、1)后,进行取反运算。每个位上都取相反值,1变成0,0变成1。
1 2 3 4 5 |
|
6、左移(<<)
参加运算的两个数,换算为二进制(0、1)后,进行左移运算,用来将一个数各二进制位全部向左移动若干位。
1 2 3 4 5 |
|
注意,观察可以发现,左移一位的结果就是原值乘2,左移两位的结果就是原值乘4。也可以用来记录流量大小相关,例如:
1M = 1<<20 1K = 1<<10
7、右移(>>)
参加运算的两个数,换算为二进制(0、1)后,进行右移运算,用来将一个数各二进制位全部向右移动若干位。
1 2 3 4 5 |
|
注意,观察可以发现,右移一位的结果就是原值除2,左移两位的结果就是原值除4,注意哦,除了以后没有小数位的,都是取整。