java右移位怎么算_Java移位运算符

一 描述

<

>>:右移运算符(算术右移),如果数字为正数时,移位后在前面补0,为负数时,则在前面补1;

>>>:无符号右移运算符(逻辑右移),忽略符号,空位补0即可。

二 Demo分析

/**

* @Program:

* @Description: Java移位运算符Demo

* @Author: heykin

* @Create: 2019-01-05 14:29

* @Since: 1.0

**/

public class Test {

public static void main(String[] args) {

/** 正数演示 **/

System.out.println("-----------------正数演示-----------------");

int num = 7;

System.out.println("原值(十进制):" + num + ";原值(二进制)" + Integer.toBinaryString(num));

int tmp = num >> 1;

System.out.println("右移1位(十进制):" + tmp + ";右移1位(二进制)" + Integer.toBinaryString(tmp));

tmp = num >>> 1;

System.out.println("无符号右移1位(十进制):" + tmp + ";无符号1位(二进制)" + Integer.toBinaryString(tmp));

tmp = num << 1;

System.out.println("左移1位(十进制):" + tmp + ";左移1位(二进制)" + Integer.toBinaryString(tmp));

/** 正数演示 **/

/** 负数演示 **/

System.out.println("-----------------负数演示-----------------");

num = -7;

System.out.println("原值(十进制):" + num + ";原值(二进制)" + Integer.toBinaryString(num));

tmp = num >> 1;

System.out.println("右移1位(十进制):" + tmp + ";右移1位(二进制)" + Integer.toBinaryString(tmp));

tmp = num >>> 1;

System.out.println("无符号右移1位(十进制):" + tmp + ";无符号1位(二进制)" + Integer.toBinaryString(tmp));

tmp = num << 1;

System.out.println("左移1位(十进制):" + tmp + ";左移1位(二进制)" + Integer.toBinaryString(tmp));

/** 负数演示 **/

}

}

复制代码

运行结果:

3b467bab73a36ad0d504dd2217ee774c.png

对输出结果补0对齐一下

正数 7

00000000 00000000 00000000 00000111 原值

00000000 00000000 00000000 00000011 右移1位

00000000 00000000 00000000 00000011 无符号右移1位

00000000 00000000 00000000 00001110 左移1位

负数 -7(负数为正数的补码=正数的反码+1)

11111111 11111111 11111111 11111001 原值

11111111 11111111 11111111 11111100 右移1位

01111111 11111111 11111111 11111100 无符号右移1位

11111111 11111111 11111111 11110010 左移1位

复制代码

可以看出,当要移位的数是正数时,右移和无符号右移的值是一样的,当移位的数是负数时,右移的后的值还是负数,无符号右移后的值则是正数。

另外在网上看到一个快速算出移位运算符结果的方法:

在不大于自身数值类型最大位数的移位时,一个数左移n位,就是将这个数乘以2的n次幂;一个数右移n位,就是将这个数除2的n次幂,然后取整。

比如int32位的(64位也是同样方法):

7 >> 1 = 7/2 取整为3

7<< 1 = 7*2 为14

如果移动位数超过了32位怎么办?把移位数和32取余数得到的数字套用即可:

如9 >> 67

1、先67对32取余,结果是3

2、然后9/8 得到结果为1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值