java位于算——一个测试搞懂位运算

说明

我们平时在看JDK源码的过程中会看到开发者会大量的使用移位运算符,那么移位运算是怎么计算的呢?通过下文的测试代码就可以知道了。

测试代码
package com.leo.demo.othertest;

/**
 * @ClassName: ByteDemoTest
 * @Description: 关于位运算的测试
 * <p>
 * 移位运算符
 * 把整数的二进制位进行左移或右移
 * 按位左移 << ,右侧补0,
 * 按位右移 >> ,左侧补符号位(最高位)
 * 无符号按位右移 >>> , 左侧补0
 * @Author: leo825
 * @Date: 2019-10-09 14:36
 * @Version: 1.0
 */
public class ByteDemoTest {

    public static void main(String[] args) {
        int xx = 20;
        /**
         * xx在内存中的二进制形式为:
         * 0000 0000 0000 0000 0000 0000 0001 0100
         * 左移1位为:xx << 1
         * 0000 0000 0000 0000 0000 0000 0010 1000
         *
         */
        System.out.println(xx + "  << 之后为: " + (xx << 1));//即20*2=40

        /**
         * xx在内存中的二进制形式为:
         * 0000 0000 0000 0000 0000 0000 0001 0100
         * 右移1位为:xx >> 1
         * 0000 0000 0000 0000 0000 0000 0000 1010
         *
         */
        System.out.println(xx + "  >> 之后为: " + (xx >> 1));//即20/2=10

        xx = -20;
        /**
         * xx在内存中的二进制形式为:
         * 1111 1111 1111 1111 1111 1111 1110 1100
         * 左移1位为:xx << 1
         * 1111 1111 1111 1111 1111 1111 1101 1000
         * 负数补码转原码:补码的补码就是原码1000 0000 0000 0000 0000 0000 0010 1000
         */
        System.out.println(xx + " << 之后为: " + (xx << 1));
        /**
         * xx在内存中的二进制形式为:
         * 1111 1111 1111 1111 1111 1111 1110 1100
         * 右移1位为:xx >> 1
         * 1111 1111 1111 1111 1111 1111 1111 0110
         * 负数补码转原码:补码的补码就是原码1000 0000 0000 0000 0000 0000 0000 1010
         */
        System.out.println(xx + " >> 之后为: " + (xx >> 1));

        xx = 20;
        /**
         * xx在内存中的二进制形式为:
         * 0000 0000 0000 0000 0000 0000 0001 0100
         * 无符号移一位:xx>>>1
         * 0000 0000 0000 0000 0000 0000 0000 1010
         */
        System.out.println(xx + "  >>> 之后为: " + (xx >>> 1));

        xx = -20;
        /**
         * xx在内存中的二进制形式为:
         * 1111 1111 1111 1111 1111 1111 1110 1100
         * 无符号移一位:xx>>>1
         * 0111 1111 1111 1111 1111 1111 1111 0110
         */
        System.out.println(xx + " >>> 之后为: " + (xx >>> 1));
    }
}

下面是运行结果:

20  << 之后为: 40
20  >> 之后为: 10
-20 << 之后为: -40
-20 >> 之后为: -10
20  >>> 之后为: 10
-20 >>> 之后为: 2147483638
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leo825...

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值