位运算的基础及常见应用

最近在看jdk源码,发现很多时候用到位运算,由于本人不是本专业的,很多位运算的内容不理解。于是上网整理位运算的一些基础知识与常用应用,以供复习、查询。  

## 位运算基础  

        System.out.println(3 & 6);   //2->10, 位与,有0为0,反之为1
        System.out.println(3 | 6);      //7->111,位或,有1为1,反之为0
        System.out.println(3 ^ 6);   //5->101,位异或,同0或同1为0,反之为1
        System.out.println(~3);       //-4-> 11111111111111111111111111111100,取反
        System.out.println(3 >> 1);       // 1 ,右移,代替除2
        System.out.println(3 << 1);       // 6,左移,代替乘2
        //负数无符号右移与右移区别,无符号右移不区分正负,右移在正数的右移基础上加个负号
        System.out.println(-6 >>> 1);       //2147483645, 无符号右移
        System.out.println(-6 >> 1);       // -3

## 位运算进阶

  • 判断某位上是否为1或设置为1的写法,拓展应用就是枚举子类,见
        System.out.println(6 >> 2 & 1);       // 1,判断从右向左第3位上是否为1
        //偶数最低位二进制为0,因此可以利用这点判断奇偶
        System.out.println(3 & 1);       // 1,3为奇数
        System.out.println(6 & 1);       // 0,6为偶数
        System.out.println(6 | 1 << 3);       // 14,把6从右向左第4位设置为1
  //枚举集合["A","B","C","D"]的子集,由乘法原理可以轻易得出共2的4次方16个子集
        List<String> list = Lists.newArrayList("A","B","C","D");
        //0-15分别对应16个子集,把0-15转为二进制数,位数上为1的字母放入结果即可
        for (int i = 0; i < 2 << 4; i++) {
            List<String> tempList = new ArrayList<>();
            for(int j=0; j<4;j++){
                if(((i>>j)&1)==1){
                    tempList.add(list.get(j));
                }
            }
            System.out.print(tempList.toString()+" ");

顺便说一下,楼主业余学了下python,这题还有一种很python的解法,代码如下:

import itertools
for i in range(5):
    print([x for x in itertools.combinations(["A","B","C","D"],i)])
  • a=a^b^b的两种运用(b^b=0)
        //在成双成对的数找唯一的值(简称找单身狗)
        List<Integer> list = Lists.newArrayList(1, 2, 3, 4, 2, 3, 1);  
        Integer res = 0;
        for (Integer x : list) {
            res ^= x;
        }
        System.out.println(res); //4  除了4是单身狗,其他都是成双成对的
        //交换a,b的值
        int a = 2, b = 3;
        a=a^b;
        b=a^b;
        a=b^a;
        System.out.printf("a=%d,b=%d%n", a, b);
  • a^(a-1)去除a二进制数最后一个1
        System.out.println(7 & 6);  //111->110即 5
        System.out.println(6 & 5); //110->100即 4
        //2的n次方只有一个1,可用此判断是否为2的幂,如下
        System.out.println(8 & 7); //1000->0000即 0

以上是位运算在实际中常见的应用,当然还有其他很多技巧未被挖崛,这里就不收录了。

转载于:https://my.oschina.net/u/3892428/blog/2999897

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值