JavaSE-位运算

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

Java中提供了各种各样的运算符,如算术运算符:+、-、*、/表示加、减、乘、除四则运算,取模运算"%",以及其他自增、自减运算符等。本篇文章中要介绍的则是位运算符。

一、Java中的进制

在Java中,对于整数的表示有四种形式:

  • 二进制:只用0,1表示,满2进1,以0b或者0B开头(进制符号中不区分大小写)。
  • 十进制:用数字0-9表示,满10进1,也是最常见的表示形式。
  • 八进制:用数字0-7表示,满8进1,以数字0开头(很容易混淆,不建议使用)。
  • 十六进制:用数字0-9和字母A(10)-F(15)表示,满16进1,以0x或者0X开头。
public class BinaryDemo1 {
    public static void main(String[] args) {
        //二进制: 5
        int num1 = 0b0101;
        //十进制: 100
        int num2 = 100;
        //八进制:8
        int num3 = 010;
        //十六进制:10
        int num4 = 0xA;
    }
}

二、原码、反码、补码

2.1 原码

在计算机中,原码是对数字的二进制定点表示,数值的最高位是符号位:对于正数,该位是0;对于负数,该位是1。正数1和负数-1的原码示例如下。(Java中int整型数据长度为4个字节,每个字节为8个bit位,即32bit位)
在这里插入图片描述
原码是最简单的编码方式,便于输入输出。但是原码并不能直接参与运算,否则可能就会出现错误的计算结果。例如,1和-1求和是0,但是如果使用原码计算则计算结果并不是0,如下所示:
在这里插入图片描述
则该原码表示的计算结果为-2。

2.2 反码

上述已经说到原码并不能直接参与计算,真正参与计算的实际是补码(下一节将会介绍),反码通常是由原码转为补码的一种过渡码,其转换规则如下:

  1. 对于正数来说,原码、反码相同。
  2. 对于负数来说,符号位不变,其他位依次取反。

例如,求整数-1的反码如下:
在这里插入图片描述

2.3 补码

在计算机运算的时候,都是按补码的形式来运算。转换规则如下:

  1. 对于正数来说,原码、补码相同(正数的原码、反码、补码都是一样的)。
  2. 对于负数来说,补码=反码+1,反码=补码-1.

例如,求-1的补码如下:
在这里插入图片描述
在2.1节中展示了使用原码直接参与计算可能会出现计算结果异常,现在使用补码来求和1和-1(1是正数,补码和原码相同,-1的补码如上述所示),补码计算示例如下:
在这里插入图片描述
此时计算结果补码表示0,对于0来说,其原码、反码、补码都是0,故使用补码进行计算未出现计算结果异常(感觉这个例子有点特殊了,总而言之,计算机底层运算时使用补码进行计算,计算完成后再转为原码表示计算结果)。

三、位运算符

Java中没有无符号数,即Java中的数都是有符号的。在Java中,一共提供了7种位运算符,以下分别来介绍这些位运算符。

3.1 按位与

Java中,按位与的位运算符为"&",表示两位全为1时结果为1,否则为0。例如,计算2&3:

public class BinaryDemo2 {
    public static void main(String[] args) {
        int num1 = 2;
        int num2 = 3;
        //按位与运算
        System.out.println("2 & 3 = " + (2 & 3));
    }
}

在这里插入图片描述
上述已经说明,底层运算时都是使用补码计算,2&3补码运算如下:
在这里插入图片描述

3.2 按位或

在Java中,按位或的位运算符为"|",表示至少其中一个为1,结果为1,否则为0。计算2|3如下:

public class BinaryDemo2 {
    public static void main(String[] args) {
        int num1 = 2;
        int num2 = 3;
        //按位与运算
        System.out.println("2 | 3 = " + (2 | 3));
    }
}

在这里插入图片描述
补码运算如下:
在这里插入图片描述

3.3 按位取反

Java中按位取反的位运算符为"~",表示如果是1,结果是0,如果是0,结果为1。例如,整数2按位取反计算:

public class BinaryDemo2 {
    public static void main(String[] args) {
        int num1 = 2;
        //按位与运算--> -3
        System.out.println("~2 = " + (~2));
    }
}

补码计算:
在这里插入图片描述

3.4 按位异或

Java中按位异或的位运算符为"^",表示其中一个为0,一个为1时结果为1,否则为0。例如,计算2异或3:

public class BinaryDemo2 {
    public static void main(String[] args) {
        int num1 = 2;
        int num2 = 3;
        //按位与运算
        System.out.println("2 ^ 3 = " + (2 ^ 3));
    }
}

在这里插入图片描述
在这里插入图片描述

3.5 算术右移

Java中算术右移的位运算符为">>",运算规则为低位溢出,符号位不变,并且使用符号位补溢出的高位。例如,4>>1计算如下:

public class BinaryDemo2 {
    public static void main(String[] args) {
        int num1 = 4;
        int num2 = 1;
        //按位与运算
        System.out.println("4 >> 1 = " + (4 >> 1));
    }
}

在这里插入图片描述
4>>2计算如下:
在这里插入图片描述
实际上,对于算术右移来说,右移n位即相当于数值除以2^n次方。4算术右移2位补码运算如下:
在这里插入图片描述
结果即为1。

3.6 算术左移

Java中算术左移的位运算符为"<<",计算规则为符号位不变,低位补0。例如计算1<<2如下:
在这里插入图片描述
计算1<<3如下:
在这里插入图片描述
跟算术右移相反,算术左移n位等于数值乘以2^n次方。1<<2补码运算如下:
在这里插入图片描述

3.7 逻辑右移

Java中逻辑右移的位运算符为">>>",逻辑右移也称为无符号右移,计算规则为低位溢出,高位补0。例如,计算3>>>2如下:
在这里插入图片描述
对应补码运算如下:

在这里插入图片描述
在Java中,没有逻辑左移的位运算符"<<<“。对于C/C++来说,不能保证”>>“是完成了算术移位即扩展符号位还是逻辑移位即填充0,即C/C++的”>>"运算符对于负数得到生成结果可能会依赖于具体实现,但是Java中则消除了这种不确定性。


总结

本次回顾的知识点主要是JavaSE中的位运算符相关的内容,这部分内容在工作中需要使用则适当使用即可,并不需要做过多的深入了解。(ps:突然发现写博客是一种非常不错的知识复习方式)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值