Java移位符

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));
    }
}

输出:

11111111111111111111111111111101
11111111111111111111111111111110

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

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

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

10000000000000000000000000000011

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

11111111111111111111111111111100

补码:反码+1

11111111111111111111111111111101

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

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

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

11111111111111111111111111111110

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

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

得到结果:

00111111111111111111111111111111

我们运行程序

11111111111111111111111111111101
111111111111111111111111111111

和我们的预期是一样的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值