位运算提升效率
原文出自知乎LeetCode
1. 位操作符
&
与运算符:全1为1,反之为0.
|
或运算符:全0为0,反之为1;只要一个位为1,结果为1.
^
异或运算符:两个位相同则为 0,不同则为 1
~
取反运算符:0 则变为 1,1 则变为 0
<<
左移运算符:向左进行移位操作,高位丢弃,低位补 0
>>
右移运算符:向右进行移位操作,对无符号数,高位补 0,对于有符号数,高位补符号位
2. 常见位运算
很多功能采用基本的运算也可以完成,但是位运算的效率更高,因为省去了将int、Integer
等整数转化为计算机可以直接识别的二进制的过程
2.1 乘除法
1 2 3 4
| int a = 2; a >> 1; a << 1;
|
2.2 交换两个数
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
void swap(int &a, int &b) { a = a + b; b = a - b; a = a - b; }
void swap(int &a, int &b) { a ^= b; b ^= a; a ^= b; }
|
2.3 判断奇偶数
1 2 3 4
| public boolean isEven(int num) { return (num & 1) == 0; }
|
2.4 交换符号
1 2 3 4 5 6
|
public int reverse(int num) { return ~a + 1; }
|
2.5 求绝对值
1 2 3 4 5 6 7 8 9 10 11 12
| int abs(int num) { int i = num >> 31; return i == 0 ? num : (~num + 1); }
int abs(int num) { int i = num >> 31; return ((num^i) - i); }
|
2.6 高低位交换
1 2 3 4 5 6 7 8 9 10 11 12
|
unsigned short a = 34520; a = (a >> 8) | (a << 8);
|