Java运算符篇之位运算符

举报
bug菌 发表于 2024/05/29 23:03:15 2024/05/29
【摘要】 咦咦咦,各位小可爱,我是你们的好伙伴 bug菌,今天又来给大家手把手教学Java SE系列知识点啦,赶紧出来哇,别躲起来啊,听我讲干货记得点点赞,赞多了我就更有动力讲得更欢哦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~

  咦咦咦,各位小可爱,我是你们的好伙伴 bug菌,今天又来给大家手把手教学Java SE系列知识点啦,赶紧出来哇,别躲起来啊,听我讲干货记得点点赞,赞多了我就更有动力讲得更欢哦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~


🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

前言

  在Java编程中,位运算符是用于直接操作二进制位的工具。位运算符提供了对单个比特进行操作的能力,能够高效地处理底层数据和实现某些算法。掌握位运算符是深入理解计算机内部工作原理和提高编程技巧的重要一步。

  本文将详细介绍Java中的位运算符,包括其基本概念、用法、源代码解析、应用场景案例、优缺点分析、类代码方法介绍、测试用例等内容,帮助读者全面了解和掌握Java中位运算符的使用方法。

摘要

  本文以Java编程语言为例,介绍位运算符的基本概念、用法、源代码解析、应用场景案例、优缺点分析、类代码方法介绍、测试用例以及全文小结和总结,帮助读者全面了解和掌握Java中位运算符的使用。

概述

  在Java中,位运算符用于对整数类型的二进制位进行操作。常见的位运算符包括:

  • & (按位与)
  • | (按位或)
  • ^ (按位异或)
  • ~ (按位非)
  • << (左移)
  • >> (右移)
  • >>> (无符号右移)

  这些运算符主要用于底层操作、数据压缩、加密算法等领域。

源代码解析

  下面是一个简单的Java程序,演示了常见位运算符的使用:

package com.example.javase.bugTest.operator.bitwiseOperators;

/**
 * @Author bug菌
 * @Source 公众号:猿圈奇妙屋
 * @Date 2024-05-26 22:35
 */
public class BitwiseOperatorsExample {
    public static void main(String[] args) {
        int a = 5;  // 二进制: 0101
        int b = 3;  // 二进制: 0011

        // 按位与
        System.out.println("a & b: " + (a & b)); // 输出: 1 (二进制: 0001)

        // 按位或
        System.out.println("a | b: " + (a | b)); // 输出: 7 (二进制: 0111)

        // 按位异或
        System.out.println("a ^ b: " + (a ^ b)); // 输出: 6 (二进制: 0110)

        // 按位非
        System.out.println("~a: " + (~a)); // 输出: -6 (二进制: 1010, 反码加1)

        // 左移
        System.out.println("a << 1: " + (a << 1)); // 输出: 10 (二进制: 1010)

        // 右移
        System.out.println("a >> 1: " + (a >> 1)); // 输出: 2 (二进制: 0010)

        // 无符号右移
        System.out.println("a >>> 1: " + (a >>> 1)); // 输出: 2 (二进制: 0010)
    }
}

  运行上述代码,将输出以下结果:

a & b: 1
a | b: 7
a ^ b: 6
~a: -6
a << 1: 10
a >> 1: 2
a >>> 1: 2

  本地实际运行结果展示如下,有条件的同学们也可以自己本地实践一下。

代码解读:

  根据如上代码作出如下解析,以便于同学们更好的理解与掌握它:

  如上代码展示了Java中的位运算符示例。首先定义了两个整数变量a和b,并初始化为5和3。接下来分别演示了位与、位或、位异或、位非、左移、右移以及无符号右移这几种位运算符的使用。

  • 位与运算符(&):对两个数的二进制表示进行位与运算,结果为二进制表示中,对应位置上的数字都为1时,结果位为1,否则为0。
    例如:a & b的结果为1。

  • 位或运算符(|):对两个数的二进制表示进行位或运算,结果为二进制表示中,对应位置上的数字只要有一个为1,结果位为1,否则为0。
    例如:a | b的结果为7。

  • 位异或运算符(^):对两个数的二进制表示进行位异或运算,结果为二进制表示中,对应位置上的数字不同时,结果位为1,否则为0。
    例如:a ^ b的结果为6。

  • 位非运算符(~):对一个数的二进制表示进行位非运算,结果为二进制表示中,每一位取反得到的结果。
    例如:~a的结果为-6。

  • 左移运算符(<<):将一个数的二进制表示向左移动指定的位数,左边超出的位数舍弃,右边不足的位补0。
    例如:a << 1的结果为10。

  • 右移运算符(>>):将一个数的二进制表示向右移动指定的位数,对于正数,左边不足的位补0;对于负数,左边补1。
    例如:a >> 1的结果为2。

  • 无符号右移运算符(>>>):将一个数的二进制表示向右移动指定的位数,无论正负数,左边不足的位都补0。
    例如:a >>> 1的结果为2。

应用场景案例

场景一:权限管理

int readPermission = 0b0001;  // 读权限
int writePermission = 0b0010; // 写权限
int executePermission = 0b0100; // 执行权限

// 设置读写权限
int permissions = readPermission | writePermission;
System.out.println("Permissions: " + Integer.toBinaryString(permissions)); // 输出: 11

// 检查是否有写权限
boolean hasWritePermission = (permissions & writePermission) != 0;
System.out.println("Has write permission: " + hasWritePermission); // 输出: true

代码解读:

  根据如上代码作出如下解析,以便于同学们更好的理解与掌握它:以上代码使用位运算来表示权限,并进行权限的设置和检查。首先,使用二进制的方式来表示不同的权限:读权限为0b0001,写权限为0b0010,执行权限为0b0100。然后,通过位运算符|将读权限和写权限合并,得到权限变量permissions的值为0b0011,即十进制的3。最后,通过位运算符&将权限变量permissions与写权限进行与运算,如果结果不为0,则表示有写权限。在这里,结果为0b0010,即十进制的2,不为0,所以输出为true,表示有写权限。

  整个过程中使用了位运算符|和&来进行位运算,实现了权限的设置和检查。

场景二:位掩码操作

int mask = 0b1111; // 位掩码
int value = 0b1010; // 原始值

// 应用掩码
int maskedValue = value & mask;
System.out.println("Masked value: " + Integer.toBinaryString(maskedValue)); // 输出: 1010

代码解读:

  根据如上代码作出如下解析,以便于同学们更好的理解与掌握它:这段代码定义了一个位掩码mask(0b1111)和一个原始值value(0b1010)。使用位与运算符(&)将掩码应用于原始值,将会保留原始值与掩码中都为1的那些位,而将其他位清零。在这个例子中,掩码中的四个位都是1,所以应用掩码后的结果就是原始值本身。打印输出maskedValue会得到二进制形式的原始值:1010。

优缺点分析

优点:

  • 位运算符速度快,适用于高性能计算。
  • 能够高效处理底层数据,节省存储空间。
  • 可用于实现一些高级算法,如加密、解密和数据压缩。

缺点:

  • 位运算符相对复杂,不易理解和调试。
  • 位操作的代码可读性差,维护难度大。
  • 对数据类型和位数有严格要求,容易出错。

类代码方法介绍

public int bitwiseAnd(int a, int b)

  • 功能:实现按位与操作。
  • 参数:a - 第一个整数,b - 第二个整数。
  • 返回值:两个整数的按位与结果。

public int bitwiseOr(int a, int b)

  • 功能:实现按位或操作。
  • 参数:a - 第一个整数,b - 第二个整数。
  • 返回值:两个整数的按位或结果。

public int bitwiseXor(int a, int b)

  • 功能:实现按位异或操作。
  • 参数:a - 第一个整数,b - 第二个整数。
  • 返回值:两个整数的按位异或结果。

public int bitwiseNot(int a)

  • 功能:实现按位非操作。
  • 参数:a - 一个整数。
  • 返回值:整数的按位非结果。

public int leftShift(int a, int n)

  • 功能:实现左移操作。
  • 参数:a - 要移动的整数,n - 移动的位数。
  • 返回值:左移后的结果。

public int rightShift(int a, int n)

  • 功能:实现右移操作。
  • 参数:a - 要移动的整数,n - 移动的位数。
  • 返回值:右移后的结果。

public int unsignedRightShift(int a, int n)

  • 功能:实现无符号右移操作。
  • 参数:a - 要移动的整数,n - 移动的位数。
  • 返回值:无符号右移后的结果。

具体类代码如下:

package com.example.javase.bugTest.operator.bitwiseOperators;

/**
 * @Author bug菌
 * @Source 公众号:猿圈奇妙屋
 * @Date 2024-05-26 22:41
 */
public class BitwiseOperatorsUtils {

    /**
     * 按位与操作
     *
     * @param a 第一个整数
     * @param b 第二个整数
     * @return 按位与结果
     */
    public static int bitwiseAnd(int a, int b) {
        return a & b;
    }

    /**
     * 按位或操作
     *
     * @param a 第一个整数
     * @param b 第二个整数
     * @return 按位或结果
     */
    public static int bitwiseOr(int a, int b) {
        return a | b;
    }

    /**
     * 按位异或操作
     *
     * @param a 第一个整数
     * @param b 第二个整数
     * @return 按位异或结果
     */
    public static int bitwiseXor(int a, int b) {
        return a ^ b;
    }

    /**
     * 按位非操作
     *
     * @param a 一个整数
     * @return 按位非结果
     */
    public static int bitwiseNot(int a) {
        return ~a;
    }

    /**
     * 左移操作
     *
     * @param a 要移动的整数
     * @param n 移动的位数
     * @return 左移结果
     */
    public static int leftShift(int a, int n) {
        return a << n;
    }

    /**
     * 右移操作
     *
     * @param a 要移动的整数
     * @param n 移动的位数
     * @return 右移结果
     */
    public static int rightShift(int a, int n) {
        return a >> n;
    }

    /**
     * 无符号右移操作
     *
     * @param a 要移动的整数
     * @param n 移动的位数
     * @return 无符号右移结果
     */
    public static int unsignedRightShift(int a, int n) {
        return a >>> n;
    }
}

代码解析:

  这段代码定义了一个名为BitwiseOperatorsUtils的公共类,其中包含了一些位运算的工具方法。

  1. bitwiseAnd(int a, int b)方法实现了按位与操作,即对两个整数进行按位与运算,并返回结果。
  2. bitwiseOr(int a, int b)方法实现了按位或操作,即对两个整数进行按位或运算,并返回结果。
  3. bitwiseXor(int a, int b)方法实现了按位异或操作,即对两个整数进行按位异或运算,并返回结果。
  4. bitwiseNot(int a)方法实现了按位非操作,即对一个整数进行按位取反运算,并返回结果。
  5. leftShift(int a, int n)方法实现了左移操作,即将一个整数向左移动指定的位数,并返回结果。
  6. rightShift(int a, int n)方法实现了右移操作,即将一个整数向右移动指定的位数,并返回结果。
  7. unsignedRightShift(int a, int n)方法实现了无符号右移操作,即将一个整数向右移动指定的位数,并返回结果。

  这些方法可以用于实现一些位运算的功能,如位掩码、位运算和位移等。通过调用这些方法,可以对整数进行不同类型的位运算操作。

测试用例

测试用例1:测试按位与方法

package com.example.javase.bugTest.operator.bitwiseOperators;

/**
 * @Author bug菌
 * @Source 公众号:猿圈奇妙屋
 * @Date 2024-05-26 22:40
 */
public class BitwiseOperatorsTest_01 {
    public static void main(String[] args) {
        int result = BitwiseOperatorsUtils.bitwiseAnd(5, 3);
        System.out.println("5 & 3: " + result); // 输出: 1
    }
}

测试结果

  针对如上测试代码,这里我本地进行实际测试一波,结果仅供参考,有条件的同学们也可以自己本地实践一下。

测试代码解析

  针对如上测试代码,这里我再具体给大家讲解下,希望能够更透彻的帮助大家理解。这段代码是一个Java类文件,其中定义了一个名为"BitwiseOperatorsTest_01"的类。在main方法中,调用了"BitwiseOperatorsUtils"类的"bitwiseAnd"方法,并将其返回值赋给了result变量。该方法接收两个整数参数,执行按位与操作,并返回结果。最后,使用System.out.println方法打印出了"5 & 3: “加上result的值,即输出了"5 & 3: 1”。

测试用例2:测试按位或方法

package com.example.javase.bugTest.operator.bitwiseOperators;

/**
 * @Author bug菌
 * @Source 公众号:猿圈奇妙屋
 * @Date 2024-05-26 22:45
 */
public class BitwiseOperatorsTest_02 {
    public static void main(String[] args) {
        int result = BitwiseOperatorsUtils.bitwiseOr(5, 3);
        System.out.println("5 | 3: " + result); // 输出: 7
    }
}

测试结果

  针对如上测试代码,这里我本地进行实际测试一波,结果仅供参考,有条件的同学们也可以自己本地实践一下。

测试代码解析

  针对如上测试代码,这里我再具体给大家讲解下,希望能够更透彻的帮助大家理解。该代码主要是测试位运算符的使用,具体分析如下:

  1. 导入了 com.example.javase.bugTest.operator.bitwiseOperators 包。
  2. 创建了一个名为 BitwiseOperatorsTest_02 的公共类。
  3. BitwiseOperatorsTest_02 类中定义了一个名为 main 的公共静态方法,用于程序的入口。
  4. main 方法中,调用了 BitwiseOperatorsUtils 类中的 bitwiseOr 方法,并传入了两个参数 5 和 3。
  5. bitwiseOr 方法的返回值赋给了 result 变量。
  6. 使用 System.out.println 方法打印输出了 "5 | 3: " 和 result 的值。

总结:该代码主要测试了位运算符 | 的使用,并输出了运算结果。

测试用例3:测试按位异或方法

package com.example.javase.bugTest.operator.bitwiseOperators;

/**
 * @Author bug菌
 * @Source 公众号:猿圈奇妙屋
 * @Date 2024-05-26 22:46
 */
public class BitwiseOperatorsTest_03 {
    public static void main(String[] args) {
        int result = BitwiseOperatorsUtils.bitwiseXor(5, 3);
        System.out.println("5 ^ 3: " + result); // 输出: 6
    }
}

测试结果

  针对如上测试代码,这里我本地进行实际测试一波,结果仅供参考,有条件的同学们也可以自己本地实践一下。

  这段代码主要是测试位运算符的异或操作符(^)的使用。代码中调用了一个名为bitwiseXor的方法,传入了两个参数:5和3。bitwiseXor方法的具体实现在BitwiseOperatorsUtils类中。在main方法中,将bitwiseXor方法的返回值赋给了result变量,并通过System.out.println方法打印了结果。最后,输出的结果是6,表示5和3进行异或运算的结果是6。

测试代码解析

  针对如上测试代码,这里我再具体给大家讲解下,希望能够更透彻的帮助大家理解。

全文小结

  本文详细介绍了Java中位运算符的基本概念、用法、源代码解析、应用场景案例、优缺点分析、类代码方法介绍、测试用例等内容。通过学习本文,读者可以全面了解和掌握Java编程中位运算符的使用方法。

总结

  位运算符在Java编程中具有重要的作用,能够高效地处理底层数据和实现某些算法。掌握位运算符的使用方法对于提高编程技巧和编写高性能代码是非常重要的。希望本文能够帮助读者更好地理解和运用Java中的位运算符。

结尾

  通过本文的学习,希望读者能够更加熟练地运用位运算符,编写出高效、健壮的Java程序,并能够在实际的编程项目中灵活应用。祝愿读者在学习和工作中取得更进一步的成就!

  … …

  好啦,这期的内容就基本接近尾声啦,若你想学习更多,你可以看看专栏的导读篇《「滚雪球学Java」教程导航帖》,本专栏致力打造最硬核 Java 零基础系列学习内容,🚀打造全网精品硬核专栏,带你直线超车;欢迎大家订阅持续学习。功不唐捐,久久为功!

「赠人玫瑰,手留余香」,咱们下期拜拜~~

附录源码

  如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。

☀️建议/推荐你

  无论你是计算机专业的学生,还是对编程感兴趣的跨专业小白,都建议直接入手「滚雪球学Java」专栏;该专栏不仅免费,bug菌还郑重承诺,只要你学习此专栏,均能入门并理解Java SE,以全网最快速掌握Java语言,每章节源码均同步「Gitee」,你真值得拥有;学习就像滚雪球一样,越滚越大,带你指数级提升。

  码字不易,如果这篇文章对你有所帮助,帮忙给bug菌来个一键三连(关注、点赞、收藏) ,您的支持就是我坚持写作分享知识点传播技术的最大动力。

  同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 ;以第一手学习bug菌的首发干货,不仅能学习更多技术硬货,还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有!

📣关于我

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 20w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。