<<(左移),>>(右移)皆属于位运算符.其运算比乘除快,所以我们可以用其优化代码。

<<左移
规则则是带符号位移,高位移出,低位补0,移动位数超过该类型的最大位数,则进行取模,如对Integer型左移34位,实际上只移动了两位。左移一位相当于乘以2的一次方,左移n位相当于乘以2的n次方。

Integer i = 7;message(Integer.toBinaryString(i));int moveNum = 3;message(i << moveNum);message(Integer.toBinaryString(i << moveNum));输出结果
the value is :111
the value is :56
the value is :111000

1
2
3
4
5
6
7
8
9
10
从上面代码可以看出确实能证明,左移n为,相当于乘以2的n次方。如何验证其带符号位位移呢?看下面的例子

Integer i = 1;message(Integer.toBinaryString(i));int moveNum = 31;message(i << moveNum);message(Integer.toBinaryString(i << moveNum));输出结果
the value is :1
the value is :-2147483648
the value is :10000000000000000000000000000000

1
2
3
4
5
6
7
8
9
10
从上面的输出结果可以看出,左移确实是带着符号位移动,向左移动了31位,1就移动到了最前面,也就是符号位上,得到了一个特殊的值,也就是-0的补码,用来代表-2的3次方。如果这个不懂,可以去看下源码反码补码的博客.

Integer i = -7;message(Integer.toBinaryString(i));int moveNum = 33;message(i << moveNum);message(Integer.toBinaryString(i << moveNum));输出结果
the value is :11111111111111111111111111111001
the value is :-14
the value is :11111111111111111111111111110010

1
2
3
4
5
6
7
8
9
10
由上面的代码可以看出,我们左移的位数是33位,实际上却只左移了1位,证实了上面所说的移动位数超过该类型的最大位数,则进行取模

右移
规则则是低位移出,高位补符号位,移动位数超过该类型的最大位数,则进行取模,如对Integer型左移34位,实际上只移动了两位。

Integer i = -7;message(Integer.toBinaryString(i));int moveNum = 1;message(i >> moveNum);message(Integer.toBinaryString(i >> moveNum));输出结果
the value is :11111111111111111111111111111001
the value is :-4
the value is :11111111111111111111111111111100

1
2
3
4
5
6
7
8
9
10
上面的二进制都是补码的形式,不要疑惑这个。可以看出上面的二进制代码,向右移动一位,然后在其高位补符号位,正数补0,负数补1.

Integer i = 7;message(Integer.toBinaryString(i));int moveNum = 34;message(i >> moveNum);message(Integer.toBinaryString(i >> moveNum));输出结果
the value is :111
the value is :1
the value is :1

1
2
3
4
5
6
7
8
9
10
上面的代码,左移34位,实际上却只左移了两位,已经做过取模了。由于是正数,高位补0。

无符号右移
无符号位移是什么意思呢,就是右移的时候,无论正负数,高位始终补0。当然,它也仅仅针对负数计算有意义。

Integer i = -7;message(Integer.toBinaryString(i));int moveNum = 1;message(i >>> moveNum);message(Integer.toBinaryString(i >>> moveNum));输出结果the value is :11111111111111111111111111111001
the value is :2147483644
the value is :1111111111111111111111111111100

1
2
3
4
5
6
7
8
9
10
11
上面代码中,右移一位后的值,其高位省略了一位0,我们来计算其值。
就是2的31次方 - 1 - 2º-2¹,其结果为2147483644

<<< 无符号左移

作者:羽xi_
来源:CSDN
原文:https://blog.csdn.net/koreyoshi326/article/details/85008708
版权声明:本文为博主原创文章,转载请附上博文链接!

java 左移和右移理解相关推荐

  1. java左移、右移、无符号右移

    右移 System.out.println(-3>>1); 结果是-2,为什么会是-2呢?下面我们来看一下. System.out.println(Integer.toHexString( ...

  2. Java 位运算理解 Java中的位移运算整理 Java右移n位 Java左移n位

    Java 位运算理解 Java中的位移运算整理 Java右移n位 Java左移n位 一.概述 1.在浏览一篇文章时,看到一个介绍 ,使用位移操作替代乘除法 ,若位移多位该怎么计算呢?  二.代码理解 ...

  3. java byte 循环左移 循环右移 rotateLeft rotateRight

    java byte 循环左移 循环右移 rotateLeft rotateRight 1.概念. 循环左移: eg1:byte in = (byte) 0x01;[0000 0001]则循环左移2位后 ...

  4. Java负整数的左移、右移、无符号右移

    Java负整数的左移.右移.无符号右移.正数的位移没有涉及到符号,而且正数的原码.反码.补码都是一样的,所以相对简单,但是对于负整数的位移,往往容易混淆. Java的<<  >> ...

  5. java循环左一_java实现循环左移和右移的简单算法

    java实现循环左移和右移的简单算法 byte a=112,用程序实现,将其循环左移三位和右移三位. 112的二进制原码:0111 0000 112循环左移3位后的二进制码:1000 0011 112 ...

  6. 彻底理解位运算——左移、右移

    相信大家在各种语言各种框架中都能看到二进制的操作.左移.右移.&.|.^等等操作.那么这篇帖子让各位彻底弄懂左移.右移. 首先先区分那个是左移.那个是右移,这很简单,从箭头指向的方向来区分.& ...

  7. (JAVA学习笔记) 如何计算2*8效率高(面试题)—— 左移和右移问题。

    左移和右移问题 面试题中如何计算(2×8)效率高. 这里的效率肯定是指计算机运算的效率,平常进行计算时直接在代码中写2*8就可以直接得出结果,但是对于计算机而言是无法直接识别的,看似结果出来的很快,但 ...

  8. 分析轮子(二)- ,, (左移、右移、无符号右移)

    前言:写 分析轮子(一)-ArrayList.java 的时候看到源码中有 int newCapacity = oldCapacity + (oldCapacity >> 1); 这样的代 ...

  9. 移位运算(左移和右移)

    如有转载,请注明出处:  http://www.cnblogs.com/flydoos/archive/2011/09/06/2169280.html 移位运算(左移和右移) 这是网上流传的" ...

  10. c语言负数左移右移_C语言位运算符:与、或、异或、取反,左移和右移

    C语言位运算符:与.或.异或.取反.左移和右移 个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型. ,则该位的结果值为1,否则为0 | ...

最新文章

  1. 看一下基于ASP.NET MVC的开源社区项目Orchard
  2. Python命令行参数学习
  3. 服务器虚拟化软件XenServer 常见问题(一)
  4. android 阴影背景显示文字_公众号排版如何做出“果冻”文字效果?
  5. json数组显示格式
  6. RabbitMQ+PHP 教程六(RPC)
  7. C#进阶系列——AOP?AOP!
  8. 中国首档程序员综艺:你有freebug吗?
  9. Java虚拟机之装载(加载、连接、初始化)
  10. 修改功能(Ajax版)
  11. 【安卓项目】期末大作业——“记账宝”APP开发案例
  12. 智能问答系统CQA调研--工业界
  13. Ubuntu20.04安装有道词典 + 卸载
  14. 洛谷 P2884 【[USACO07MAR]每月的费用Monthly Expense】
  15. springmvc配置thymeleaf视图解析器
  16. 已解决RuntimeError: CUDA error: device-side assert triggered异常的正确解决方法,亲测有效!!!
  17. 氚云徐平俊:低代码赛道热度陡升,今年增长目标200%
  18. 2019.9-电赛国赛-基于FDC2214的纸张计数显示装置
  19. 扩散模型Diffusion Model 【质量提升2.0】【扩散模型】
  20. mysql存储emoji表情_MySQL中支持emoji表情的存储

热门文章

  1. 360校招 求立方体表面积
  2. 【源码解析】Activity的启动模式
  3. AOSP-AOKP-CM
  4. Redhat 8 制作本地光盘镜像yum源
  5. 实战教程:平面设计配色原则
  6. 刷题——求斐波那契数列的第n项(迭代)
  7. 波士顿房价预测python_多元线性回归—波士顿房价预测(版本一)
  8. java 大小写_java中如何进行大小写字母转换?
  9. 动力节点『lol版』Java学习路线图(四)Javaweb阶段
  10. 【Linux】gcc编译工具,断点的设置,gdb调试