滚雪球学Java(09-4):Java中的位运算符,你真的掌握了吗?

简介: 【2月更文挑战第2天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!

在这里插入图片描述

  咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~


🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!

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

@[toc]

前言

  Java是一门流行的高级编程语言,因其易于学习、安全、可移植性和广泛的应用而受到了广泛的青睐。本篇文章主要介绍Java中的位运算符,为零基础的Java学习者提供详细的入门指导。

摘要

  Java的位运算符是一组非常重要的运算符,它们能够对二进制数字进行操作,包括移位、与、或、异或等操作,这些操作对于优化程序的性能以及处理特定类型的数据非常有用。

  本文将着重介绍Java中的位运算符,包括它们的用法、应用场景案例以及其他相关的知识点。

Java-位运算符

简介

  在计算机程序中,二进制数字是非常常见的。Java的位运算符可以对这些二进制数字进行操作,其中包括移位、与、或、异或等操作。

Java中的位运算符包括以下几种:

  • 按位与操作符:&
  • 按位或操作符:|
  • 按位异或操作符:^
  • 按位取反操作符:~
  • 左移位操作符: <<
  • 右移位操作符: >>
  • 无符号右移位操作符: >>>

下面我们将分别详细介绍这些操作符的使用方法。

按位与操作符

  按位与操作符使用符号“&”,它用于将两个操作数的每一位进行对比。如果两个操作数的对应位都是1,则结果为1,否则结果为0。

例如:

int a = 60; // 二进制表示为0011 1100
int b = 13; // 二进制表示为0000 1101
int c = a & b; // 二进制表示为0000 1100

  在上面的例子中,变量a的值是60,其二进制表示为0011 1100,变量b的值是13,其二进制表示为0000 1101。通过使用按位与操作符对这两个数进行操作,我们得到了一个新的值c,其二进制表示为0000 1100,这就是按位与操作的结果。

按位或操作符

  按位或操作符使用符号“|”,它用于将两个操作数的每一位进行对比。如果两个操作数的对应位只要有一个是1,则结果为1,否则结果为0。

例如:

int a = 60; // 二进制表示为0011 1100
int b = 13; // 二进制表示为0000 1101
int c = a | b; // 二进制表示为0011 1101

  在上面的例子中,变量a的值是60,其二进制表示为0011 1100,变量b的值是13,其二进制表示为0000 1101。通过使用按位或操作符对这两个数进行操作,我们得到了一个新的值c,其二进制表示为0011 1101,这就是按位或操作的结果。

按位异或操作符

  按位异或操作符使用符号“^”,它用于将两个操作数的每一位进行对比。如果两个操作数的对应位相同,则结果为0,否则结果为1。

例如:

int a = 60; // 二进制表示为0011 1100
int b = 13; // 二进制表示为0000 1101
int c = a ^ b; // 二进制表示为0011 0001

  在上面的例子中,变量a的值是60,其二进制表示为0011 1100,变量b的值是13,其二进制表示为0000 1101。通过使用按位异或操作符对这两个数进行操作,我们得到了一个新的值c,其二进制表示为0011 0001,这就是按位异或操作的结果。

按位取反操作符

  按位取反操作符使用符号“~”,它用于将操作数的每一位进行取反操作,即1变为0,0变为1。

例如:

int a = 60; // 二进制表示为0011 1100
int b = ~a; // 二进制表示为1100 0011

  在上面的例子中,变量a的值是60,其二进制表示为0011 1100。通过使用按位取反操作符对这个数进行操作,我们得到了一个新的值b,其二进制表示为1100 0011,这就是按位取反操作的结果。

左移位操作符

  左移位操作符使用符号“<<”,它用于将操作数的二进制值向左移动指定的位数。左移位操作符的结果是原来的值乘以2的移位数次幂。

例如:

int a = 60; // 二进制表示为0011 1100
int b = a << 2; // 二进制表示为1111 0000

  在上面的例子中,变量a的值是60,其二进制表示为0011 1100。通过使用左移位操作符将这个数左移2位,我们得到了一个新的值b,其二进制表示为1111 0000,这就是左移位操作的结果。

右移位操作符

  右移位操作符使用符号“>>”,它用于将操作数的二进制值向右移动指定的位数。右移位操作符的结果是原来的值除以2的移位数次幂。

例如:

int a = 60; // 二进制表示为0011 1100
int b = a >> 2; // 二进制表示为0000 1111

  在上面的例子中,变量a的值是60,其二进制表示为0011 1100。通过使用右移位操作符将这个数右移2位,我们得到了一个新的值b,其二进制表示为0000 1111,这就是右移位操作的结果。

无符号右移位操作符

  无符号右移位操作符使用符号“>>>”,它用于将操作数的二进制值向右移动指定的位数,但是它会在空位上插入0,而不是符号位的复制。

例如:

int a = -60; // 二进制表示为1111 1111 1111 1111 1111 1111 1100 0100
int b = a >>> 2; // 二进制表示为0011 1111 1111 1111 1111 1111 1111 1001

  在上面的例子中,变量a的值是-60,其二进制表示为1111 1111 1111 1111 1111 1111 1100 0100。通过使用无符号右移位操作符将这个数右移2位,我们得到了一个新的值b,其二进制表示为0011 1111 1111 1111 1111 1111 1111 1001,这就是无符号右移位操作的结果。

案例解析

以下是Java中位运算符的源代码解析:

测试代码演示

package com.demo.javase.day09;

/**
 * Java之位运算符案例演示
 *
 * @Author bug菌
 * @Date 2023-11-08 22:59
 */
public class BitwiseOperatorsTest {
   
   

    public static void main(String[] args) {
   
   
        int a = 60; // 二进制表示为0011 1100
        int b = 13; // 二进制表示为0000 1101
        int c = a & b; // 按位与操作
        System.out.println("a & b = " + c); // 输出:a & b = 12

        int d = a | b; // 按位或操作
        System.out.println("a | b = " + d); // 输出:a | b = 61

        int e = a ^ b; // 按位异或操作
        System.out.println("a ^ b = " + e); // 输出:a ^ b = 49

        int f = ~a; // 按位取反操作
        System.out.println("~a = " + f); // 输出:~a = -61

        int g = a << 2; // 左移位操作
        System.out.println("a << 2 = " + g); // 输出:a << 2 = 240

        int h = a >> 2; // 右移位操作
        System.out.println("a >> 2 = " + h); // 输出:a >> 2 = 15

        int i = -60; // 二进制表示为1111 1111 1111 1111 1111 1111 1100 0100
        int j = i >>> 2; // 无符号右移位操作
        System.out.println("i >>> 2 = " + j); // 输出:i >>> 2 = 1073741821
    }
}

  在上面的源代码中,我们定义了一些变量并使用了Java中的位运算符对它们进行操作。使用System.out.println()方法输出了各个操作的结果,以便我们可以查看其输出结果。

测试结果

  根据如上测试用例,本地测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加更多的测试数据或测试方法,进行熟练学习以此加深理解。

在这里插入图片描述

测试代码分析

  根据如上测试用例,在此我给大家进行深入详细的解读一下测试代码,以便于更多的同学能够理解并加深印象。
  如上测试用例代码演示了Java中的位运算符,具体说明如下:

  1. 定义整型变量a和b,分别赋值为60和13,二进制表示分别为0011 1100和0000 1101。
  2. 使用按位与操作符&,将a和b进行按位与操作,结果为12,即 0011 1100 & 0000 1101 = 0000 1100,输出结果为"a & b = 12"。
  3. 使用按位或操作符|,将a和b进行按位或操作,结果为61,即 0011 1100 | 0000 1101 = 0011 1101,输出结果为"a | b = 61"。
  4. 使用按位异或操作符^,将a和b进行按位异或操作,结果为49,即 0011 1100 ^ 0000 1101 = 0011 0001,输出结果为"a ^ b = 49"。
  5. 使用按位取反操作符~,将a进行按位取反操作,结果为-61,即 ~0011 1100 = 1100 0011,输出结果为"~a = -61"。
  6. 使用左移位操作符<<,将a左移2位,结果为240,即 0011 1100 << 2 = 1111 0000,输出结果为"a << 2 = 240"。
  7. 使用右移位操作符>>,将a右移2位,结果为15,即 0011 1100 >> 2 = 0000 1111,输出结果为"a >> 2 = 15"。
  8. 定义整型变量i赋值为-60,其二进制表示为1111 1111 1111 1111 1111 1111 1100 0100,使用无符号右移位操作符>>>,将i右移2位,结果为1073741821,即1111 1111 1111 1111 1111 1100 0100 11,输出结果为"i >>> 2 = 1073741821"。

应用场景案例

Java中的位运算符广泛应用于以下场景:

位掩码操作

  位掩码是一种将多个开关的状态存储在单个数中的技术,它广泛应用于计算机图形学领域。使用Java中的位运算符,我们可以轻松地执行位掩码操作,从而方便地管理不同颜色、材质、纹理等的开关状态。

  例如,我们可以使用按位或操作符将不同属性的位掩码组合在一起,以便快速检查它们的状态。

优化算法

  Java中的位运算符也可用于优化算法的性能。例如,使用位移操作代替乘除操作可以大大提高程序的速度。在处理像素、图像和视频等大量数据时,这种优化尤为重要。

  例如,我们可以在位移操作中使用位移运算符,以便更快地移动数据。

处理位数据

  Java中的位运算符也可用于处理位数据,例如字节、字、长整型等。使用这些运算符,我们可以轻松地提取位数据、计算位数据和操作位数据。

  例如,我们可以使用按位与操作符来提取特定位的值,并使用左移位操作来将其放置在正确的位置。

总结

  Java中的位运算符是非常重要的运算符,它们可以对二进制数字进行操作,包括移位、与、或、异或等操作。使用这些运算符,我们可以方便地进行位掩码操作、优化算法和处理位数据。

  本文详细介绍了Java中的各种位运算符及其使用方法,同时还介绍了位运算符的应用场景案例和其他相关知识点。通过学习本文,读者可以更好地理解Java中的位运算符和其作用,从而提高编程技能和效率。

  ...

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

附录源码

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

☀️建议/推荐你


  无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。

  最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。

  同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

📣关于我

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


目录
相关文章
|
5月前
|
存储 安全 Java
滚雪球学Java(60):深入解析Java中的Vector集合类!
【6月更文挑战第14天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
254 59
滚雪球学Java(60):深入解析Java中的Vector集合类!
|
2月前
|
存储 Java 测试技术
Java零基础(22) - Java位运算符,了解一下!
【9月更文挑战第1天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
44 5
|
3月前
|
存储 Java 编译器
java的7种位运算符
java的7种位运算符
77 15
|
4月前
|
SQL 安全 Java
「滚雪球学Java」教程导航帖(更新2024.07.16)
《滚雪球学Spring Boot》是一个面向初学者的Spring Boot教程,旨在帮助读者快速入门Spring Boot开发。本专通过深入浅出的方式,将Spring Boot开发中的核心概念、基础知识、实战技巧等内容系统地讲解,同时还提供了大量实际的案例,让读者能够快速掌握实用的Spring Boot开发技能。本书的特点在于注重实践,通过实例学习的方式激发读者的学习兴趣和动力,并引导读者逐步掌握Spring Boot开发的实际应用。
83 1
「滚雪球学Java」教程导航帖(更新2024.07.16)
|
5月前
|
存储 Java 测试技术
滚雪球学Java(66):Java之HashMap详解:深入剖析其底层实现与源码分析
【6月更文挑战第20天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
44 3
滚雪球学Java(66):Java之HashMap详解:深入剖析其底层实现与源码分析
|
5月前
|
存储 Java 测试技术
滚雪球学Java(67):深入理解 TreeMap:Java 中的有序键值映射表
【6月更文挑战第21天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
55 2
滚雪球学Java(67):深入理解 TreeMap:Java 中的有序键值映射表
|
5月前
|
存储 算法 Java
滚雪球学Java(65):深入理解Java中的Map接口:实现原理剖析
【6月更文挑战第19天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
45 3
滚雪球学Java(65):深入理解Java中的Map接口:实现原理剖析
|
5月前
|
存储 缓存 算法
滚雪球学Java(62):HashSet的底层实现原理解析
【6月更文挑战第16天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
41 3
滚雪球学Java(62):HashSet的底层实现原理解析
|
5月前
|
存储 缓存 Java
滚雪球学Java(64):LinkedHashSet原理及实现解析
【6月更文挑战第18天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
60 1
滚雪球学Java(64):LinkedHashSet原理及实现解析
|
5月前
|
存储 Java 测试技术
滚雪球学Java(61):从源码角度解读Java Set接口底层实现原理
【6月更文挑战第15天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
63 1
滚雪球学Java(61):从源码角度解读Java Set接口底层实现原理