Java中的位运算符全解

 更新时间:2022年03月02日 15:50:05   作者:小小茶花女  
这篇文章主要为大家详细介绍了Java中的位运算符,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

1. &(按位与运算符)

&按位与的运算规则是将两边的数转换为二进制位,然后运算最终值,运算规则即(两个为真才为真):1&1=1 , 1&0=0 , 0&1=0 , 0&0=0

public class Main {
    public static void main(String[] args) {
        // &按位与,运算符两边的条件值会先转换为2进制,然后再比对运算
        /**
         *   0 0 1 1  
         *   0 1 0 1
         *  ----------- 
         *   0 0 0 1
         */
        int a = 3&5;
        /**
         *   0 0 0 1
         *   0 0 1 0
         *  ----------- 
         *   0 0 0 0
         */
        int b = 1&2;
        System.out.println(a);// 1
        System.out.println(b);// 0
    }
}

2. |(按位或运算符)

|按位或和&按位与计算方式都是转换二进制再计算,不同的是运算规则(一个为真即为真):1|0 = 1 , 1|1 = 1 , 0|0 = 0 , 0|1 = 1

public class Main {
    public static void main(String[] args) {
        // |按位或,运算符两边的条件值会先转换为2进制,然后再比对运算
        /**
         *   0 0 1 1
         *   0 1 0 1
         *  -------------
         *   0 1 1 1
         */
        int a = 3|5;
        /**
         *   0 0 0 1
         *   0 0 1 0
         *  -------------
         *   0 0 1 1
         */
        int b = 1|2;
        System.out.println(a);// 7
        System.out.println(b);// 3
    }
}

3. ^(异或运算符)

^异或运算符顾名思义,异就是不同,其运算规则为1^0 = 1 , 1^1 = 0 , 0^1 = 1 , 0^0 = 0

public class Main {
    public static void main(String[] args) {
        /**
         *   0 0 1 1
         *   0 1 0 1
         *  -------------
         *   0 1 1 0
         */
        int a = 3^5;
        /**
         *   0 0 0 1
         *   0 0 1 0
         *  -------------
         *   0 0 1 1
         */
        int b = 1^2;
        System.out.println(a);// 6
        System.out.println(b);// 3
    }
}

4. <<(左移运算符)

5<<2的意思为5的二进制位往左挪两位,右边补0

5的二进制位是0000 0101 , 就是把有效值101往左挪两位就是0001 0100 ,正数左边第一位补0,负数补1,等于乘于2的n次方,十进制位是5*2^2=20

public class Main {
    public static void main(String[] args) {
        /**
         * 5<<2的意思为5的二进制位往左挪两位,右边补0
         *  0 0 0 0 0 1 0 1
         *  0 0 0 1 0 1 0 0
         */
        System.out.println(5<<2); // 20
    }
}

5. >> (右移移运算符)

凡位运算符都是把值先转换成二进制再进行后续的处理

5的二进制位是0000 0101,右移两位就是把101左移后为0000 0001,正数左边第一位补0,负数补1,等于除于2的n次方,结果为1

public class Main {
    public static void main(String[] args) {
        /**
         * 5>>2的意思为5的二进制位往右挪两位,左边补0
         *  0 0 0 0 0 1 0 1
         *  0 0 0 0 0 0 0 1
         */
        System.out.println(5<<2); // 1
    }
}

6. ~(取反运算符)

取反就是1为0,0为1

5的二进制位是0000 0101,取反后为1111 1010,值为-6

public class Main {
    public static void main(String[] args) {
        /**
         *     0 0 0 0 0 1 0 1
         *   ---------------------  
         *     1 1 1 1 1 0 1 0
         *  
         *  1、如果 11111010 想转为负的十进制,因为最高位是1,所以先将11111001减1得到11111001
         *  2、取反 00010101,然后计算出 00000100 对应的十进制为6
         *  3、所以 11111010 最终对应的十进制为 -6
         *  
         *     1 1 1 1 1 0 1 0
         *   - 0 0 0 0 0 0 0 1
         *   ---------------------
         *     1 1 1 1 1 0 0 1
         *   ---------------------
         *     0 0 0 0 0 1 0 0
         */
        System.out.println(~5); // -6
    }
}

7. >>>(无符号右移运算符)

(1) 正数无符号右移

无符号右移运算符和右移运算符的主要区别在于负数的计算,因为无符号右移是高位补0,移多少位补多少个0。

15的二进制位是0000 1111 , 右移2位0000 0011,结果为3

public class Main {
    public static void main(String[] args) {
        /**
         *     0000 1111
         *   --------------- 
         *     0000 0011
         */
        System.out.println(15>>>2); // 3
    }
}

(2) 负数无符号右移

-6的二进制是6的二进制取反再加1,6的二进制也就是0000 0000 0000 0000 0000 0000 0000 0110,取反后加1为1111 1111 1111 1111 1111 1111 1111 1010,右移三位0001 1111 1111 1111 1111 1111 1111 1111

public class Main {
    public static void main(String[] args) {
        System.out.println(-6>>>3); // 536870911
    }
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容! 

相关文章

  • 如何用ObjectMapper将复杂Map转换为实体类

    如何用ObjectMapper将复杂Map转换为实体类

    这篇文章主要介绍了如何用ObjectMapper将复杂Map转换为实体类的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • MyBatis插件机制超详细讲解

    MyBatis插件机制超详细讲解

    MyBatis在四大对象的创建过程中,都会有插件进行介入。插件可以利用动态代理机制一层层的包装目标对象,而实现在目标对象执行目标方法之前进行拦截的效果
    2022-11-11
  • Java 使用 FFmpeg 处理视频文件示例代码详解

    Java 使用 FFmpeg 处理视频文件示例代码详解

    这篇文章主要介绍了Java 使用 FFmpeg 处理视频文件示例代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • ShardingSphere jdbc实现分库分表核心概念详解

    ShardingSphere jdbc实现分库分表核心概念详解

    这篇文章主要为大家介绍了ShardingSphere jdbc实现分库分表核心概念详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 两万字详解Java Sring String的常见操作以及StringBuffer StringBuilder的区别

    两万字详解Java Sring String的常见操作以及StringBuffer StringBuilder的区别

    本篇文章带你认识Sring、String的常见操作和StringBuffer 与StringBuilder的区别(字符串详解),对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Java实现手写一个线程池的示例代码

    Java实现手写一个线程池的示例代码

    线程池技术想必大家都不陌生把,相信在平时的工作中没有少用,而且这也是面试频率非常高的一个知识点,那么大家知道它的实现原理和细节吗?本文就来通过手写一个简单的线程池框架,去掌握线程池的基本原理,感兴趣的可以学习一下
    2022-10-10
  • Sentinel中三种流控模式的使用详解

    Sentinel中三种流控模式的使用详解

    这篇文章主要为大家详细介绍了Sentinel中三种流控模式(预热模式,排队等待模式和热点规则)的使用,文中的示例代码讲解详细,感兴趣的可以了解下
    2023-08-08
  • Java Spring boot日期和时间统一设置三种方法

    Java Spring boot日期和时间统一设置三种方法

    时间和日期的统一设置在项目中经常是会遇到的,下面这篇文章主要给大家介绍了关于Java Spring boot日期和时间统一设置的三种方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-08-08
  • 浅析Java中JNI静态注册和动态注册

    浅析Java中JNI静态注册和动态注册

    这篇文章主要为大家详细介绍了Java中JNI静态注册和动态注册的相关知识,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-12-12
  • Springboot之@Controller注解不生效问题及解决

    Springboot之@Controller注解不生效问题及解决

    这篇文章主要介绍了Springboot之@Controller注解不生效问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10

最新评论