java_左移_右移_无符号右移_区别

最高位是符号位,补码形式存储。

二者的不同点在于“>>”在执行右移操作时,若参与运算的数字为正数,则在高位补0;若为负数,则在高位补1。而“>>>”则不同,无论参与运算的数字为正数或为负数,在执运算时,都会在高位补0。

左移运算没有有符号和无符号左移动,在左移时,移除高位的同时在低位补0。对于整数,如果移动导致符号变为1,那该数就变为负数

// 注意负数在无符号右移和右移(带符号)的区别

-10原始:
11111111111111111111111111110110

-10右移一位://补一
11111111111111111111111111111011

-10无符号右移一位://补0
01111111111111111111111111111011

-10无符号右移二位:
00111111111111111111111111111101


public class Test {

    public static void main(String[] args) {
        int number = 0;
        
        number=10;
        //原始数二进制
        System.out.println(number +"原始:");
        printInfo(number);

        
        number=10;
        //左移一位        
        System.out.println(number +"左移一位:");
        number = number << 1;    
        printInfo(number);
        System.out.println(number);
        
        number=10;
        //右移一位
        System.out.println(number +"右移一位:");
        number = number >> 1;        
        printInfo(number);
        System.out.println(number);



        number=10;
        //无符号右移一位
        System.out.println(number +"无符号右移一位:");
        number=number>>>1;       
        printInfo(number);
        System.out.println(number);

        
        System.out.println("----------------------");
        
        
        int negativeN = 0;

        negativeN= -10;
        //原始数二进制
        System.out.println(negativeN +"原始:");
        printInfo(negativeN);
        
        
        
        
        
        
        
        negativeN= -10;
        //右移一位
        System.out.println(negativeN +"右移一位:");
        negativeN = negativeN >> 1;        
        printInfo(negativeN);
        System.out.println(negativeN);

        
        negativeN= -10;
        //左移一位
        System.out.println(negativeN +"左移一位:");
        negativeN = negativeN << 1;        
        printInfo(negativeN);
        System.out.println(negativeN);


        
        negativeN= -10;
        //无符号右移一位
        System.out.println(negativeN +"无符号右移一位:");
        negativeN = negativeN >>> 1;        
        printInfo(negativeN);
        System.out.println(negativeN);



        negativeN= -10;
        //无符号右移二位
        System.out.println(negativeN +"无符号右移二位:");
        negativeN = negativeN >>> 2;        
        printInfo(negativeN);
        System.out.println(negativeN);


        //没有无符号左移
    }

    /**
     * 输出一个int的二进制数
     * @param num
     */
    private static void printInfo(int num){
        System.out.println(Integer.toBinaryString(num));
    }
}

//output
10原始:
1010
10左移一位:
10100
20
10右移一位:
101
5
10无符号右移一位:
101
5
----------------------
-10原始:
11111111111111111111111111110110
-10右移一位:
11111111111111111111111111111011
-5
-10左移一位:
11111111111111111111111111101100
-20
-10无符号右移一位:
1111111111111111111111111111011
2147483643
-10无符号右移二位:
111111111111111111111111111101
1073741821
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值