博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【原创】Java移位运算
阅读量:5171 次
发布时间:2019-06-13

本文共 2619 字,大约阅读时间需要 8 分钟。

学习移位运算,首先得知道参与移位运算的类型的位数,那先来复习下Java基础类型的占位数吧。

  • Java基础类型
Java基础类型总结一览表
类型 二进制位数 最大值 最小值 初始化值 表示形式 带符号
char 8 127(2^7-1) -128(-2^7) 0 二进制补码
short 16 32767(2^15 - 1) -32768(-2^15) 0 二进制补码
int 32 2,147,485,647(2^31 - 1) -2,147,483,648(-2^31) 0 二进制补码
long 64 9,223,372,036,854,775,807(2^63 -1) -9,223,372,036,854,775,808(-2^63) 0L 二进制补码
float 32 3.4028235E38 1.4E-45 0.0f IEEE 754标准的浮点数
double 64 1.7976931348623157E308 4.9E-324 0.0f IEEE 754标准的浮点数
boolean 待定分析 只有true 和false 只有true 和false false JVM中用0/1表示  

float和double的区别在于一个是单精度的浮点数,一个是双精度的浮点数。

浮点数是机器内部的指数型的一种表示,可以分解为四个部分:数符号,尾数,指数符号,指数

数符号位指数符号位都是占一位,表示正负。

对于float,指数部分占8位,其中指数符号一位,指数值部分占7位,尾数部分占24位;对于double,指数部分占16位,指数部分占15位,尾数部分占48位。所以double比float表示的数更大更精准,但与此同时带来的是两倍的内存消耗。

boolean占多数位的问题要看情况而论,再JVM中,对布尔值的操作都是替换成int型了,所以是占用32位;如果定义的是布尔型的byte数组,则JVM将其编译为byte数组类型,这时候占用了8位。其实这里也听疑惑的,为啥一个boolean可以一会占8位,一会占32位呢?个人理解感觉是在真正表示boolean的时候,应该都是只有1位,非0即1,但是具体编译的时候其他占用位可能是用来做其他用途。

好了,接下来,来看看移位运算的问题了。

Java的移位运算符包括三种:、>>(带符号右移)和>>>(无符号右移)。  

  • 左移运算符    <<

用法:value << number

原则:丢弃最高位,低位补0

注意事项:char,byte和short型在移位时,会先转换为int型,然后再进行移位操作;

                  当移动位数超过移动数value的位数时,会做一个取模操作,例如45<<34,则具体移动时是移动2位,因为34%32=2。

实例:

1. 例子程序

public class Test {    public static void main(String args[]) {          int num =0x40000000;           System.out.println(num);         num = num << 1;         System.out.println(num);    }}

2. 程序结果

1073741824-2147483648

选取了一个典型用例,该例子说明,符号位也会连同一起移动,数字位如果为1且移动到了符号位,会将数变为负数。

  • 带符号右移    >>

用法:value >> number

原则:符号位不变,左边依次补上符号位,且与此同时最低位要舍弃

注意事项:char,byte和short型在移位时,会先转换为int型,然后再进行移位操作;

                  当移动位数超过移动数value的位数时,会做一个取模操作,例如45<<34,则具体移动时是移动2位,因为34%32=2。

实例:

1. 例子程序

public class Test {    public static void main(String args[]) {          int num1 =0x80000000;           int num2 = 0x00000003;         System.out.println(num1);         System.out.println(num2);         num1 = num1 >> 2;         num2 = num2 >> 1;         System.out.println(num1);         System.out.println(num2);    }}

2. 运行结果

-21474836483-5368709121

num1说明了符号会跟着往右边跑,带符号移动。

num2说明了低位在舍弃,由3变为1了。

  • 无符号右移    >>>

用法:value >>> number

原则:符号位不变,左边依次补上0,且与此同时最低位要舍弃

注意事项:char,byte和short型在移位时,会先转换为int型,然后再进行移位操作;

                  当移动位数超过移动数value的位数时,会做一个取模操作,例如45<<34,则具体移动时是移动2位,因为34%32=2。

实例:

1. 例子程序

public class Test {    public static void main(String args[]) {          int num1 =0x80000000;           int num2 = 0x00000003;         System.out.println(num1);         System.out.println(num2);         num1 = num1 >>> 1;         num2 = num2 >>> 33;         System.out.println(num1);         System.out.println(num2);    }}

2. 运行结果

-2147483648310737418241

从num1可以看出符号位也当做数字位跟着一起移动了

转载于:https://www.cnblogs.com/gslyyq/p/4136655.html

你可能感兴趣的文章
[leedcode 137] Single Number II
查看>>
[转载]如何捕获控制台消息
查看>>
myeclipse激活+Aptana安装配置
查看>>
嵊州D1T1 总统先生,一路走好!
查看>>
Python字符串图解
查看>>
[家里蹲大学数学杂志]第270期张恭庆编《泛函分析讲义》2.5节以前的习题参考解答...
查看>>
博文内部设置目录尝试
查看>>
Linux下的.NET之旅:第一站,CentOS+Mono+Xsp构建最简单的ASP.NET服务器
查看>>
什么是生成器
查看>>
电脑快捷键总结
查看>>
VS 快捷键
查看>>
QT语言翻译
查看>>
HTML DOM对象的属性和方法介绍(原生JS方法)
查看>>
js手机号批量滚动抽奖代码实现
查看>>
properties类
查看>>
php常见问题辨析(二)
查看>>
面试、笔试中常用的SQL语句(数据库知识必杀)一共50个!!!
查看>>
BigDecimal的add方法
查看>>
实现MFC扩展DLL中导出类和对话框
查看>>
windows 弹出 api-ms-win-crt-runtime-l1-1-0.dll 丢失的问题
查看>>