算法中的位操作

 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     }

 

转载于:https://www.cnblogs.com/aoeiuvAQU/p/11193014.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值