java 左移和右移理解
<<(左移),>>(右移)皆属于位运算符.其运算比乘除快,所以我们可以用其优化代码。
<<左移
规则则是带符号位移,高位移出,低位补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 左移和右移理解相关推荐
- java左移、右移、无符号右移
右移 System.out.println(-3>>1); 结果是-2,为什么会是-2呢?下面我们来看一下. System.out.println(Integer.toHexString( ...
- Java 位运算理解 Java中的位移运算整理 Java右移n位 Java左移n位
Java 位运算理解 Java中的位移运算整理 Java右移n位 Java左移n位 一.概述 1.在浏览一篇文章时,看到一个介绍 ,使用位移操作替代乘除法 ,若位移多位该怎么计算呢? 二.代码理解 ...
- java byte 循环左移 循环右移 rotateLeft rotateRight
java byte 循环左移 循环右移 rotateLeft rotateRight 1.概念. 循环左移: eg1:byte in = (byte) 0x01;[0000 0001]则循环左移2位后 ...
- Java负整数的左移、右移、无符号右移
Java负整数的左移.右移.无符号右移.正数的位移没有涉及到符号,而且正数的原码.反码.补码都是一样的,所以相对简单,但是对于负整数的位移,往往容易混淆. Java的<< >> ...
- java循环左一_java实现循环左移和右移的简单算法
java实现循环左移和右移的简单算法 byte a=112,用程序实现,将其循环左移三位和右移三位. 112的二进制原码:0111 0000 112循环左移3位后的二进制码:1000 0011 112 ...
- 彻底理解位运算——左移、右移
相信大家在各种语言各种框架中都能看到二进制的操作.左移.右移.&.|.^等等操作.那么这篇帖子让各位彻底弄懂左移.右移. 首先先区分那个是左移.那个是右移,这很简单,从箭头指向的方向来区分.& ...
- (JAVA学习笔记) 如何计算2*8效率高(面试题)—— 左移和右移问题。
左移和右移问题 面试题中如何计算(2×8)效率高. 这里的效率肯定是指计算机运算的效率,平常进行计算时直接在代码中写2*8就可以直接得出结果,但是对于计算机而言是无法直接识别的,看似结果出来的很快,但 ...
- 分析轮子(二)- ,, (左移、右移、无符号右移)
前言:写 分析轮子(一)-ArrayList.java 的时候看到源码中有 int newCapacity = oldCapacity + (oldCapacity >> 1); 这样的代 ...
- 移位运算(左移和右移)
如有转载,请注明出处: http://www.cnblogs.com/flydoos/archive/2011/09/06/2169280.html 移位运算(左移和右移) 这是网上流传的" ...
- c语言负数左移右移_C语言位运算符:与、或、异或、取反,左移和右移
C语言位运算符:与.或.异或.取反.左移和右移 个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型. ,则该位的结果值为1,否则为0 | ...
最新文章
- 看一下基于ASP.NET MVC的开源社区项目Orchard
- Python命令行参数学习
- 服务器虚拟化软件XenServer 常见问题(一)
- android 阴影背景显示文字_公众号排版如何做出“果冻”文字效果?
- json数组显示格式
- RabbitMQ+PHP 教程六(RPC)
- C#进阶系列——AOP?AOP!
- 中国首档程序员综艺:你有freebug吗?
- Java虚拟机之装载(加载、连接、初始化)
- 修改功能(Ajax版)
- 【安卓项目】期末大作业——“记账宝”APP开发案例
- 智能问答系统CQA调研--工业界
- Ubuntu20.04安装有道词典 + 卸载
- 洛谷 P2884 【[USACO07MAR]每月的费用Monthly Expense】
- springmvc配置thymeleaf视图解析器
- 已解决RuntimeError: CUDA error: device-side assert triggered异常的正确解决方法,亲测有效!!!
- 氚云徐平俊:低代码赛道热度陡升,今年增长目标200%
- 2019.9-电赛国赛-基于FDC2214的纸张计数显示装置
- 扩散模型Diffusion Model 【质量提升2.0】【扩散模型】
- mysql存储emoji表情_MySQL中支持emoji表情的存储