详谈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日

相关文章

  • 详解Spring的两种代理方式:JDK动态代理和CGLIB动态代理

    Spring的两种代理方式 在使用Spring框架时,我们常常会使用到AOP(面向切面编程)的相关技术,而代理是AOP中必不可少的一个环节。在Spring中,支持两种代理方式:JDK动态代理和CGLIB动态代理。这两种代理方式都有各自的特点和优劣,具体使用哪种方式则要根据具体的情况而定。 JDK动态代理 JDK动态代理是基于接口的代理,它要求目标对象必须实现…

    Java 2023年5月20日
    00
  • Java处理InterruptedException异常的理论与实践

    Java处理InterruptedException异常的理论与实践 在多线程编程中,InterruptedException异常是常见的一种异常。该异常是由Thread类的interrupt()方法引发的,常用于中止线程的运行,但在线程等待、阻塞或者睡眠时会被抛出。本文将详细介绍Java处理InterruptedException异常的理论与实践。 理论 …

    Java 2023年5月27日
    00
  • 谈谈Java 线程池

    下面就来详细讲解「Java 线程池」的攻略。 线程池概述 线程池是一种多线程处理方式,它可以有效地减少线程创建和销毁过程中的性能开销,提高程序的性能和响应速度。常见的线程池有 FixedThreadPool、CachedThreadPool、ScheduledThreadPool、SingleThreadPool等。 Java 线程池的实现 Java 线程池…

    Java 2023年5月30日
    00
  • Springmvc ResponseBody响应json数据实现过程

    为了实现Spring MVC ResponseBody响应JSON数据,我们需要使用Jackson来序列化Java对象到JSON格式的字符串,然后将其添加到HTTP响应中。以下是实现此过程的完整攻略: 准备工作 在开始进行Spring MVC ResponseBody响应JSON数据的实现过程之前,我们需要执行以下步骤: 确保在项目中引入了Jackson库,…

    Java 2023年5月26日
    00
  • Spring MVC 4.1.3 + MyBatis零基础搭建Web开发框架(注解模式)

    下面是Spring MVC 4.1.3 + MyBatis零基础搭建Web开发框架(注解模式)的完整攻略。 1. 环境搭建 JDK安装及环境变量配置 Maven安装及配置 Eclipse/IDEA集成Maven插件及配置 2. 项目建立 利用Maven建立项目:新建Maven项目,设置GroupId、ArtifactId、Version等基本信息。 导入相关…

    Java 2023年5月31日
    00
  • SpringBoot处理请求参数中包含特殊符号

    下面是详细的讲解过程,希望能对你有所帮助。 1. 为什么需要特殊处理请求参数中的特殊符号? 在进行web开发时,我们常常需要从前端页面中收集数据,这些数据会作为请求参数传递给后端应用程序。但是在请求参数中,有一些特殊符号可能会引发错误,导致后端无法正确解析请求参数,从而无法处理请求。例如常见的特殊符号有:+、&、%、#、/等。 SpringBoot的…

    Java 2023年5月19日
    00
  • java如何调用Groovy脚本

    当Java想要调用Groovy脚本时,可以通过GroovyShell类的方法来完成。具体步骤如下: 步骤一:构建GroovyShell实例 在Java代码中,首先需要构建一个GroovyShell实例,该实例将被用来执行Groovy脚本。构建GroovyShell实例的方法有多种,下面是其中一种方法: import groovy.lang.Binding; …

    Java 2023年5月26日
    00
  • 如何使用SpringSecurity保护程序安全

    当我们开发应用程序的时候,应该极力确保应用程序的安全性,因为数据安全至关重要。 SpringSecurity是一种开源安全框架,可以保护我们的应用程序,并确保具有良好的身份验证和授权,本文将详细讲解如何使用SpringSecurity保护程序安全。 SpringSecurity的基本概念 SpringSecurity是一种基于Servlet过滤器的安全框架,…

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