学习移位运算,首先得知道参与移位运算的类型的位数,那先来复习下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. 运行结果

-2147483648
3
-536870912
1

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. 运行结果

-2147483648
3
1073741824
1

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

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

【原创】Java移位运算相关推荐

  1. 关于java移位运算的一点讨论

    框架乱飞的年代,时常还得往框架源码里看,对内在原理没点理解,人家就会认为你不太行.平时开发你可能没咋用过位移运算,但往源码里一看,就时常能看到它.我也是看着看着,突然仔细一琢磨,又不由得发现自己基础知 ...

  2. java移位运算 cpu gpu_关于java操作中的移位运算

    packagecom.dgjianke.ch03;/*** 关于二进制数据的一些操作 *@authordgjianke **/ public classBitManipulation {/*** 打印 ...

  3. Java移位运算之算术右移位

    算术左移运算符 >>运算规则:按二进制形式把所有的数字向右移动对应巍峨位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1. 语法格式: 需要移位的数字 >> 移位 ...

  4. Java二进制位运算、移位运算、、

    为什么80%的码农都做不了架构师?>>>    Java二进制位运算.移位运算 思考题 1.请看下面的代码段,回答a,b,c,d,e结果是多少? public static void ...

  5. java逻辑移位和算术移位,关于对移位运算的理解

    标签: 之前在<计算机组成原理>这门课中学习了很多,其中包括二进制数的移位运算.当时并不理解他们用来作甚,迷迷糊糊的状态,学了都不知道为什么要学.什么东西总是到了需要用到的时候,才明白,哦 ...

  6. Java从入门到精通08-二进制、位运算、移位运算

    Java从入门到精通08-二进制.位运算.移位运算 二进制(Binary)数用0和1两个数字及其组合来表示任何数.进位规则是"逢2进1",数字1在不同的位上代表不同的值,按从右到左 ...

  7. Java中的位运算符、移位运算

    一.位运算 Java中有4个位运算,它们的运算规则如下: (1)按位与 (&)  :两位全为1,结果为1,否则为0: (2)按位或  (|)   :两位有一个为1,结果为1,否则为0: (3) ...

  8. 【Java】移位运算

    以前一直没有研究二进制的移位运算的应用场景是什么,怎么运算?怎么实现数据的四则运算的? 直到最近,在看Think in Java的书籍,才真正理解这个东西.下面记录一下学习笔记. 1,二进制 1.1 ...

  9. Java位运算之移位运算

    文章目录 移位运算 左移 << 位运算符 右移 >> 位运算符 无符号右移 >>> 运算符 移位运算 移位运算符在程序设计中,是位操作运算符的一种.移位运算符 ...

  10. Java中的 移位 运算

    Java中的 移位 运算 正数 左移 右移 无符号右移 负数 右移 无符号右移 左移 下面通过代码来演示: (在注释中 会标明 移位运算的 一些理论 ) public class Move {publ ...

最新文章

  1. ucosii事件控制块------消息邮箱与消息队列
  2. 社区发现算法 - Fast Unfolding(Louvian)算法初探
  3. 几种任务调度的 Java 实现方法与比较--转载
  4. 转贴:电子商务如何提升网站转化率之:谷歌9条
  5. leetcode链表篇
  6. win7下程序运行权限问题解决方案
  7. 螺杆泵matlab,基于Matlab与VC++混合编程的螺杆泵转子型线设计
  8. 解题报告(LeetCode):Max Points on a Line
  9. 插入行政区划编码的sql代码
  10. 一文读懂TOGAF企业架构
  11. 关于翁恺老师Java网课中细胞自动机的一点点想法
  12. 计算机软件 题目,计算机软件论文题目
  13. ldoce6 android,少儿英语学习词典 朗文当代LDOCE6双解词典
  14. 关于jmeter客户端实现中HttpClient4与Java的区别
  15. Android如何应对不同分辨率手机匹配问题
  16. 使用iso镜像文件创建yum源
  17. .nav ul .mall a:hover 是什么意思
  18. C# 第三方开源控件库,非常强大实用,好比devexpress
  19. 怎么弄计算机题的空缺排名,2015年计算机一级msoffice考前选择题练习40道
  20. PyQt5 - QSS

热门文章

  1. 小D课堂 - 零基础入门SpringBoot2.X到实战_第4节 Springboot2.0单元测试进阶实战和自定义异常处理_20、SpringBoot2.x配置全局异常实战...
  2. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_2_Stream流中的常用方法_forEach...
  3. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_01 File类_3_绝对路径和相对路径...
  4. 良冶之子,必学为裘;良弓之子,必学为箕
  5. POJ 1236 Network of Schools (校园网)
  6. Android 开发 学习网站
  7. 浅谈单调队列优化dp
  8. VR:下一个技术风口
  9. inline-block和float
  10. 在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败