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

yizhihongxing

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

相关文章

  • SpringSecurity基于散列加密方案实现自动登录

    下面是详细讲解基于散列加密方案实现 Spring Security 自动登录的攻略。 1. 简介 Spring Security 是一个基于 Spring 框架实现的安全框架,它提供了一系列的安全服务,在 Web 安全、认证、授权等方面有着非常好的表现。其中之一就是实现自动登录。 自动登录是指用户在第一次登录之后,下一次再进入系统时,无需再次输入账号和密码,…

    Java 2023年5月20日
    00
  • java webservice上传下载文件代码分享

    下面是“java webservice上传下载文件代码分享”的完整攻略: 1. 准备工作 在开始实现文件上传下载的功能之前,我们需要准备好以下几点: 安装Java与Eclipse IDE开发环境; 下载并安装Apache Tomcat服务器; 导入JAX-WS 开发包,以便能够使用JAX-WS创建Webservice服务。 2. 创建文件上传下载的Webse…

    Java 2023年5月19日
    00
  • Java语法基础之循环结构语句详解

    Java语法基础之循环结构语句详解 简介 循环结构是编程语言中非常重要的一部分,可以让程序轻松地重复执行特定的任务,提高代码的复用性和效率。Java 语言支持多种循环结构语句,其中包括 for、while 和 do-while 三种类型。在本篇文章中,我们将详细介绍循环结构语句在 Java 语言中的应用。 for 循环 for 循环语句是 Java 语言中最…

    Java 2023年5月23日
    00
  • IDEA使用SpringAssistant插件创建SpringCloud项目

    下面是“IDEA使用SpringAssistant插件创建SpringCloud项目”的详细攻略: 准备工作 在开始之前,需要保证你的环境中已经安装了JDK和IDEA,并且已经安装了SpringAssistant插件。 创建SpringCloud项目 打开IDEA,选择New Project。 在弹出的New Project窗口中,选择SpringAssis…

    Java 2023年5月19日
    00
  • jEdit Java编辑器汉化教程 附中文补丁下载地址

    以下是“jEdit Java编辑器汉化教程 附中文补丁下载地址”的完整攻略。 什么是jEdit编辑器? jEdit是一个功能强大的Java代码编辑器,同时也可用于编辑其他类型的文本文件。jEdit支持许多插件和可配置选项,使其成为高度可定制和灵活的文本编辑器。 如何汉化jEdit编辑器? 以下是汉化jEdit编辑器的步骤: 第一步:下载中文语言包 可以通过以…

    Java 2023年5月26日
    00
  • Java 其中翻转字符串的实现方法

    要实现Java中字符串翻转,有多种方法可以选择,包括使用for循环、StringBuilder和递归等。下面将分别介绍它们的实现方法: 使用for循环 使用for循环实现Java中字符串的翻转,可以先将字符串转换成字符数组,再使用两个指针分别从字符串的开头和结尾向中间遍历,每遍历一次,则将两个指针指向的字符互换位置,最终完成翻转。代码如下: public s…

    Java 2023年5月27日
    00
  • 在idea中创建SpringBoot项目

    下面我会给出详细的教程步骤。 一、安装Java和IntelliJ IDEA 在创建SpringBoot项目之前,您需要先安装Java和IntelliJ IDEA开发工具。 如果您还没有Java环境,请先从官方网站中下载并安装JAVA环境。请注意,SpringBoot 2.x版本至少需要Java 8。 然后,在官方网站上下载适合您操作系统的IntelliJ I…

    Java 2023年5月15日
    00
  • SpringBoot +DynamicDataSource切换多数据源的全过程

    下面我就来详细讲解SpringBoot + DynamicDataSource切换多数据源的全过程。 1. 概述 在实际项目中,经常会遇到需要切换多数据源的情况,SpringBoot + DynamicDataSource可以很好地解决这个问题。本文将介绍如何使用SpringBoot + DynamicDataSource实现多数据源的切换过程。 2. 示例…

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