Java移位符

来源:互联网 发布:通关宝典考试软件下载 编辑:程序博客网 时间:2024/06/05 19:21

title:Java移位符

date:2017年11月12日21:58:00


java中有三种移位运算符

<<      :     左移运算符,num << 1,相当于num乘以2 ,

>>      :     右移运算符,num >> 1,相当于num除以2,对于正数,高位补0,对于负数,高位补1

>>>    :     无符号右移,忽略符号位,空位都以0补齐

在介绍移位运算符之前,我们有必要讲一些计算机的基础知识:计算机中的原码、补码和反码

  • 原码:

    原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值.

  • 反码:

    反码的表示方法是:

    正数的反码是其本身

    负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.

  • 补码

    补码的表示方法是:

​ 正数的补码就是其本身

​ 负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

Java移位运算符使用实例

我们来编写一个例子来分析Java移位运算符

package com.wangcc.MyJavaSE;public class ShiftingTest {    public static void main(String[] args) {        int num1 = -3;        printInfo(num1);        num1 = num1 >> 1;        printInfo(num1);    }    private static void printInfo(int num) {        System.out.println(Integer.toBinaryString(num));    }}

输出:

1111111111111111111111111111110111111111111111111111111111111110

首先,我们要知道在计算机中负数是用补码表示的,我们来证实这一点。

我们来计算下-3的补码。

首先,我们得到-3的原码。我们知道在Java中,int类型是32位的,所以原码:

10000000000000000000000000000011

反码,符号位不变,其他为均取反:

11111111111111111111111111111100

补码:反码+1

11111111111111111111111111111101

很明显和第一行输出是一致的。

然后第二行的输出是通过num1>>1操作之后得到的,>>1代表右移一位(>>2自然就表示右移两位)

右移运算符作用到负数时,采取的是高位补1的方式。所以得到的是

11111111111111111111111111111110

我们将num1>>1改成num1>>>2继续测试。

先我们按照无符号右移的高位补0

得到结果:

00111111111111111111111111111111

我们运行程序

11111111111111111111111111111101111111111111111111111111111111

和我们的预期是一样的。

原创粉丝点击