位运算 加法详解

位运算操作基础 符号描述运算规则&位与运算两个位都为1时,结果才为1|位或运算两个位都为0时,结果才为0^异或运算两个位相同为0,相异为1~取反运算0变1,1变

位运算操作基础


符号描述运算规则
&位与运算两个位都为1时,结果才为1
|位或运算两个位都为0时,结果才为0
^异或运算两个位相同为0,相异为1
~取反运算0变1,1变0
<<左移运算各二进位全部左移若干位,高位丢弃,低位补0
>>右移运算各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)

注意:位运算符优先级很低,所以在运用的时候最好加上括号


常用位操作小技巧

判断奇偶
  奇偶数只要根据末位是0还是1就可判断,因此可用if (x & 1)来判断x的奇偶性,条件判断为真即为奇数,反之为偶数。

		int x = 0;if ((x & 1) == 1) {System.out.println("x为奇数");} else {System.out.println("x为偶数");}

位运算加法

  不考虑进位时

// 有这四种情况
1 + 1 = 0;
1 + 0 = 1;
0 + 1 = 1;
0 + 0 = 0;// 可以用异或运算(^)来代替
1 ^ 1 = 0;
1 ^ 0 = 1;
0 ^ 1 = 1;
0 ^ 0 = 0;

  判断什么时候会进位

0 + 0 = 00;//不需要
1 + 0 = 00;//不需要
0 + 1 = 00;//不需要
1 + 1 = 10;//需要//可以用 位与运算(&) 代替判断
0 & 0 = 0;//不进位
1 & 0 = 0;//不进位
0 & 1 = 0;//不进位
1 & 1 = 1;//需要进位//使用 左移运算(<<) 进行进位
1 << 1 = 10;

  遇到有进位时

// 正常加
10 + 11 = 101// 用 异或运算(^) 来计算加法
10 ^ 11 = 01; // 用 位与运算(&) 来判断是否需要进位 并用 左移运算(<<) 进位
10 & 11 = 10;//结果大于0 需要进位
10 << 1 = 100;//将 异或运算(^) 计算出来的值 加上 位与运算(&) 并进位 计算出来的值
100 + 01 = 101;//普通加法
100 ^ 01 = 101;//用 ^ 代替

最终代码

    private static int add(int a, int b) {if (b != 0) {//直到无法进位int sum = a ^ b;b = (a & b) << 1;a = sum;return add(a, b);} else {return a;}

位运算乘法
  乘法就是n个数相加,我们只需要多次计算加法即可

    public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int a = scanner.nextInt();int b = scanner.nextInt();int multiplication = 0;if ((b & 1) == 1) {multiplication = a;}for (int i = 0; i < b / 2; i++) {multiplication += add(a, a);}System.out.println(multiplication);}private static int add(int a, int b) {if (b != 0) {//直到无法进位int sum = a ^ b;b = (a & b) << 1;a = sum;return add(a, b);} else {return a;}