写点什么

bit 位操作及其算法应用

用户头像
Skysper
关注
发布于: 2020 年 12 月 26 日

基本操作

与: 1 & 1 = 1 、 1 & 0 = 0 、 0 & 0 = 0

或:1 | 1 = 1 、 1 | 0 = 1 、0 | 0 = 0

非: ~1 = -2 、 ~1 + 1 = -1(取反 + 1)



异或操作

可以理解为 无进位相加,也可以理解为获取比特中不匹配的位

1、N ^ N = 0

2、N ^ 0 = N

3、无序性 A ^ B ^ C = C ^ B ^ A = C ^ A ^ B

4、得到最右侧的1: X & (-X)



位移操作

<<:带符号左移,高位移出,低位补0,左移n位相当于乘以2的n次方

1 << 2 = 4
1 << 34 = 1 << (34 % 32) = 1 << 2 = 4

>>:带符号右移,高位补符号位(左移n位等于除以2的n次方并取整数部分)

13 >> 1 = 6
13 >> 2 = 3
13 >> 34 = 13 >> (34 % 32) = 13 >> 2 = 3

>>>:无符号位移,高位始终补0,主要对于负数处理有意义,对于正数,等价于 >>

-8 >>> 2 = 1073741822



奇偶判断

奇数:N & 1 = 1

偶数:N & 1 = 0



应用案例

通过与、异或操作完成两个数字相加

public static int add(int a, int b) {
while(b != 0) {
int x = a & b;
//无进位相加
a = a ^ b;
//进位
b = x << 1;
if(b == 0) {
break;
}
}
return a;
}



判断一个数字是否是2次幂:

public static boolean isPowerOfTwo(int x)
{
//检查x > 0
// x & x -1 ==0 表示原 x 中只有1个比特位是1
return (x>0) && (x & (x - 1))==0;
}

位运算广泛应用于布隆过滤器、八皇后问题、GA遗传算法等领域,除了是对问题抽象的一种思路,使用比特位来解决能够提升问题求解的效率



用户头像

Skysper

关注

还未添加个人签名 2016.03.29 加入

还未添加个人简介

评论

发布
暂无评论
bit位操作及其算法应用