详谈Java中的二进制及基本的位运算

详谈Java中的二进制及基本的位运算

什么是二进制

二进制是一种采用0和1两个数码表示数字的方法,被广泛应用于计算机科学领域。在Java中,可以用整型变量存储二进制数。

在Java中,整型变量默认采用十进制存储,但是可以采用其他进制的数字进行初始化。例如:

int num1 = 10; // 十进制
int num2 = 0b1010; // 二进制
int num3 = 012; // 八进制
int num4 = 0xA; // 十六进制

其中,0b开头表示二进制,0开头表示八进制,0x开头表示十六进制。

位运算符

Java中提供了以下位运算符,可以用于对二进制数进行操作:

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

下面分别进行详细介绍。

按位与(&)

按位与运算符(&)的运算规则是:两个二进制数的对应位都为1时,该位结果为1,否则为0。

例如:

int num1 = 0b1010; // 二进制1010
int num2 = 0b1100; // 二进制1100
int num3 = num1 & num2; // 按位与运算,num3为二进制1000,即十进制8

按位或(|)

按位或运算符(|)的运算规则是:两个二进制数的对应位都为0时,该位结果为0,否则为1。

例如:

int num1 = 0b1010; // 二进制1010
int num2 = 0b1100; // 二进制1100
int num3 = num1 | num2; // 按位或运算,num3为二进制1110,即十进制14

按位异或(^)

按位异或运算符(^)的运算规则是:两个二进制数的对应位相同则为0,不同则为1。

例如:

int num1 = 0b1010; // 二进制1010
int num2 = 0b1100; // 二进制1100
int num3 = num1 ^ num2; // 按位异或运算,num3为二进制0110,即十进制6

按位取反(~)

按位取反运算符(~)的运算规则是:将所有二进制数的位取反(0变为1,1变为0)。

例如:

int num1 = 0b1010; // 二进制1010
int num2 = ~num1; // 按位取反运算,num2为二进制0101,即十进制5

左移(<<)

左移运算符(<<)的运算规则是:将二进制数向左移动指定位数,右边补0。

例如:

int num1 = 0b1010; // 二进制1010
int num2 = num1 << 2; // 左移两位,num2为二进制101000,即十进制40

右移(>>)

右移运算符(>>)的运算规则是:将二进制数向右移动指定位数,左边补原来的符号位。

例如:

int num1 = 0b1010; // 二进制1010
int num2 = num1 >> 2; // 右移两位,num2为二进制10,即十进制2

无符号右移(>>>)

无符号右移运算符(>>>)的运算规则是:将二进制数向右移动指定位数,左边补0。

例如:

int num1 = -10; // 十进制-10,二进制11111111111111111111111111110110
int num2 = num1 >>> 2; // 无符号右移两位,num2为二进制00111111111111111111111111111101,即1073741821

示例

示例1

需求:判断一个数是否是2的整数次幂。

实现代码如下:

public static boolean isPowerOfTwo(int num) {
    return num > 0 && (num & (num - 1)) == 0;
}

该方法的原理是:如果一个数是2的整数次幂,那么它的二进制表示只有一位是1,其余位都是0。例如:2的二进制是10,4的二进制是100,8的二进制是1000,以此类推。

由于2的整数次幂的二进制表示只有一个1,那么这个数减去1之后,除了最高位的1,其余位都是0。例如:1的二进制是1,1-1=0,其二进制为0;2的二进制是10,2-1=1,其二进制为1;4的二进制是100,4-1=11,其二进制为11,以此类推。

那么,如果将一个2的整数次幂减去1后,与原来的数进行按位与运算,结果必然是0,因为它们的二进制只有1位是相同的。

示例2

需求:用最短的代码实现交换两个数的值。

实现代码如下:

public static void swap(int a, int b) {
    a ^= b;
    b ^= a;
    a ^= b;
}

该方法的原理是:运用按位异或运算的交换律,a和b分别执行两次异或运算,就相当于a和b的值交换了。

总结

二进制和位运算在计算机科学领域中有着广泛的应用,掌握这些知识可以帮助我们更好地理解计算机的工作原理,提高程序的效率。在Java中,我们可以采用整型变量存储二进制数,并用位运算符操作这些数字。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详谈Java中的二进制及基本的位运算 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • Java分治法与二分搜索算法实例分析

    Java分治法与二分搜索算法实例分析 – 完整攻略 分治法 分治法(Divide and Conquer)是一种算法设计思想,它将原问题分成若干个子问题,然后将子问题逐一分解、解决,最终将子问题的解合并得到原问题的解。 分治法一般包含三个步骤:分解原问题,解决子问题,合并子问题的解。具体实现时,一般采用递归结构。 下面是一个使用分治法的例子:在一个无序数组中…

    Java 2023年5月19日
    00
  • 图文详解Java的反射机制

    图文详解Java的反射机制 什么是反射机制 Java中的一个重要概念就是反射机制。简单的来说,反射机制是指在运行时动态地获取类的信息以及使用类的信息的能力。通过反射,我们可以在运行时获取类的属性、方法、构造函数等信息,并且可以在运行时动态地进行类的实例化等操作。有了这些能力,我们可以更加灵活地使用Java编写程序。 反射机制的基本用法 获取类对象 我们首先需…

    Java 2023年5月26日
    00
  • eclipse3.2.2 + MyEclipse5.5 + Tomcat5.5.27 配置数据库连接池

    以下是针对”eclipse3.2.2 + MyEclipse5.5 + Tomcat5.5.27 配置数据库连接池”的完整攻略,包括两条示例说明: 1. 配置Tomcat服务器 首先,需要在Eclipse中配置Tomcat服务器,以便将自己的web项目部署到Tomcat中进行测试。步骤如下: 在Eclipse中点击”Window -> Preferen…

    Java 2023年6月16日
    00
  • extjs_02_grid显示本地数据、显示跨域数据

    现在我来详细讲解“extjs_02_grid显示本地数据、显示跨域数据”的完整攻略。 1. Grid 显示本地数据 1.1 示例说明 下面是一个简单的示例,演示如何创建 Ext JS Grid 并显示本地数据。 Ext.application({ name: ‘MyApp’, launch: function() { // 创建数据模型 Ext.define…

    Java 2023年6月16日
    00
  • jsp struts1 标签实例详解第2/2页

    下面我将详细讲解JSP Struts1标签实例详解的完整攻略。该攻略分为两页,这里我将着重对第二页进行讲解。 一、JSP Struts1标签实例详解(第2/2页) 本文主要对Struts标签库进行介绍,讲解它们的使用方法和常用属性。 1. html:submit(表单提交按钮) html:submit标签用于创建表单提交按钮。以下是html:submit标签…

    Java 2023年6月15日
    00
  • 浅谈maven的jar包和war包区别 以及打包方法

    下面就是关于“浅谈maven的jar包和war包区别 以及打包方法”的完整攻略。 什么是Maven Maven是一个Java项目的自动化构建工具,可以帮助我们自动化地完成项目构建、打包、依赖管理等工作。 jar包和war包的区别 Maven中的jar包和war包是两种不同的打包方式。jar包是Java程序的一种标准的JAR文件格式,一般用于打包Java类库、…

    Java 2023年5月20日
    00
  • Java实现“年-月-日 上午/下午时:分:秒”的简单代码

    这里提供两种 Java 实现 “年-月-日 上午/下午时:分:秒” 格式代码的方法。 方法一:使用 SimpleDateFormat 类 import java.text.SimpleDateFormat; import java.util.Date; public class DateFormatDemo { public static void main…

    Java 2023年5月20日
    00
  • Java实现天天酷跑小游戏完整代码(附源码)

    Java实现天天酷跑小游戏完整代码(附源码) 简介 天天酷跑是一款非常有趣的小游戏,如何在Java中实现这个小游戏呢?以下是完整的Java实现天天酷跑小游戏的代码,包括Java Swing界面、游戏逻辑等部分。 游戏界面 本游戏的界面使用了Java Swing库,实现了基本的图形化界面。其中,我们使用JPanel来绘制游戏场景,使用JLabel来绘制游戏角色…

    Java 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部