一、前言
看视频的时候有看到讲位运算,感觉听得蒙蒙的,看到了一些关于位运算的文章,感觉挺有意思的,所以,做个笔记吧~~
二、代码
1、不用加号实现两个数相加
public class Bitwise {
public static void main(String[] args) {
//不用加号实现加法
int a = 3;
int b = 4;
while(b != 0){
//temp_a存储a和b异或的结果 相当于不带进位的加法
int temp_a = a ^ b;
//temp_b存储a和b按位与结果并左移一位 这相当于计算进位 因为只有两个都为1的时候才产生进位
int temp_b = a & b << 1;
//更新a为不带进位的加法结果
a = temp_a;
//更新b为进位
b = temp_b;
}
//当没有进位的时候 a中存储了最终结果
System.out.println(a);
}
}
2、判断一个数字是否为2的k次幂
当一个数字是2的幂时它的最高位为1
2(10) 4(100) 8(1000)
设这个初始数字为n
n-1时除了最高位其余位置都为1
1(01) 3(011) 7(0111)
所以当n&(n-1)==0时说明这个数字就是2的k次幂
static boolean Check(int n){
//检查n是否大于0 2的幂必须为正数 因为0和负数都不是2的幂
//检查n和n-1按位与操作是否为0
//如果n是2的幂 则未禁止表示只有一个1
//例如2(10)4(100)8(1000)
//当n是2的幂时 n-1的二进制表示是n的最高位1变为0 其余位置变为1
//例如2(10)-1 = 1(01) 4(100)-1 = 3(011)
//因此n&(n-1)得到0
return n > 0 && (n & (n-1))==0;
}
三、总结
位运算是一个很快的运算,也很有意思,也很复杂。。。