1 public class BitOperation {
2
3 //对两个输入参数做加法运算,但是不能使用 “+” 运算符
4 //先通过异或塞选出不用进位的情况,然后再用与运算和左移运算计算出进位的情况,迭代更新出最后的结果
5 public static int plus(int a, int b) {
6 int aTemp = 0, bTemp = 0;
7
8 while (b != 0) {
9 aTemp = a ^ b;
10 bTemp = (a & b) << 1;
11 a = aTemp;
12 b = bTemp;
13 }
14 return a;
15 }
16
17 //不创建临时变量的情况下进行交换两个数
18 public static void swap(int a, int b) {
19 a ^= b; // a 中存放两数互异的点位
20 b ^= a; // 取反 b 中不同于 a 的点位,也就是实现了 b = a
21 a ^= b; // 取反 a 中不同于 b 的点位,也就是实现了 a = b
22
23 System.out.println(a + " "+ b);
24 }
25
26 //把 A 转换成 B ,需要改变多少位?
27 //两个数做异或的结果就是两个数差异所在,然后只需计算这个结果中有多少个 1 即可
28 public static int convertA2B(int A, int B) {
29 int n = A ^ B;
30 int count = 0;
31 while (n != 0) {
32 n = n & (n - 1); // n - 1 是将 n 的最低位为零
33 count++;
34 }
35
36 return count;
37 }
38
39 public static void main(String[] args) {
40
41 int s = 8, k = 2, n = 2, t = 4, x = 5, y = 9;
42 System.out.println("测试第 k 位: "+(s & (1 << k)));
43 System.out.println("设置第 k 位: "+(s |= (1 << k)));
44 System.out.println("第 k 位置零: "+(s &= ~(1 << k)));
45 System.out.println("切换第 k 位值: "+(s ^= ~(1 << k)));
46 System.out.println("乘以 2^n: "+(s << n));
47 System.out.println("除以 2^n: "+(s >> n));
48 System.out.println("交集: "+(s & t));
49 System.out.println("并集: "+(s | t));
50 System.out.println("减法: "+(s & ~t));
51 System.out.println("交换: "+(x = x^y^(y=x)));
52 System.out.println("取出最小非 0 位: "+(s & (-s)));
53 System.out.println("取出最小 0 位: "+(~s & (s + 1)));
54
55 }