位运算是比较底层原始的运算方式,往往要比一般的运算符运算效率要快,值得学习掌握
目录
取余数,如果除数为 2 的倍数,可利用 & 运算加速 600%
首先我们看看位运算的原理
假设我们取 A=60 B=13
运算符 | 描述 | 实例 |
---|---|---|
& | 按位与操作,按二进制位进行"与"运算。运算规则: 0&0=0; 0&1=0; 1&0=0; 1&1=1; | (A & B) 将得到 12,即为 0000 1100 |
| | 按位或运算符,按二进制位进行"或"运算。运算规则: 0|0=0; 0|1=1; 1|0=1; 1|1=1; | (A | B) 将得到 61,即为 0011 1101 |
^ | 异或运算符,按二进制位进行"异或"运算。运算规则: 0^0=0; 0^1=1; 1^0=1; 1^1=0; | (A ^ B) 将得到 49,即为 0011 0001 |
~ | 取反运算符,按二进制位进行"取反"运算。运算规则: ~1=0; ~0=1; | (~A ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式。 |
<< | 二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。 | A << 2 将得到 240,即为 1111 0000 |
>> | 二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。 | A >> 2 将得到 15,即为 0000 1111 |
下面就来看看有哪些位运算的妙用吧(整理并搜集)
判断奇偶
通常运算方法 位运算方法 a%2==0为真时为偶数 a&1为真时为奇数
交换变量
通常运算方法 位运算方法
- 一种就是三变量交换法(临时变量)
- 加减乘除来算
b = (__int64)((__int64)a << 32 | (a = b)) >> 32;//位运算
a^=b;b^=a;a^=b
原理:
第一步没啥好说a = a^b
第二步:b=b^a,也就是b=b^a^b,也就是b=a^0,此处换值
第三步:a=a^b 也就是a=a^b^a,也就是b
向下取整(结果为小数,取整数部分)
通常运算方法 位运算方法 一般方法 Math.floor()
x = int(1.232)
x|0
x = 1.232 >> 0;
乘以或者除以2的n次方
通常运算方法 位运算方法 (将返回x的n次幂)pow (double x, double n);
乘n次幂:x<<n
除n次幂:x>>n
原理:2进制移动一位相当于乘以2
正负号转换
通常运算方法 位运算方法 i = -i;
- i = ~i + 1; // NOT 写法
- i = (i ^ -1) + 1; // XOR 写法
取余数,如果除数为 2 的倍数,可利用 & 运算加速 600%
通常运算方法 位运算方法 x = 131 % 4; x = 131 & (4 - 1);
RGB 色彩分离和合并
分离 合并 var 24bitColor:uint = 0xff00cc;
var r:uint = 24bitColor >> 16;
var g:uint = 24bitColor >> 8 & 0xFF;
var b:uint = 24bitColor & 0xFF;var r:uint = 0xff;
var g:uint = 0x00;
var b:uint = 0xcc;
var 24bitColor:uint = r << 16 | g << 8 | b;