Java基础——左移和右移
首先要明白一点,这里面所有的操作都是针对存储在计算机中中二进制的操作,那么就要知道,正数在计算机中是用二进制表示的,负数在计算机中使用补码表示的。
左移位:<<,有符号的移位操作
左移操作时将运算数的二进制码整体左移指定位数,左移之后的空位用0补充
右移位:>>,有符号的移位操作
右移操作是将运算数的二进制码整体右移指定位数,右移之后的空位用符号位补充,如果是正数用0补充,负数用1补充。
例子:
public static void main(String[] args)
{
System.out.println(3<<2);//3左移2位
System.out.println(-3<<2);//-3左移2位
System.out.println(6>>2);//6右移2位
System.out.println(-6>>2);//-6右移2位
}
输出结果
12
-12
1
-2
下面解释一下:
00000000 00000000 00000000 00000011 +3在计算机中表示
00000000 00000000 00000000 0000001100 左移2位,补0,结果为12
----------------------------------------------------------------------------------------------
00000000 00000000 00000000 00000011 +3在计算机中表示
11111111 11111111 11111111 11111100
11111111 11111111 11111111 11111101 -3在计算机中表示
11111111 11111111 11111111 1111110100 左移2位,补0,结果为负数,就是补码了,求原码
10000000 00000000 00000000 00001011
10000000 00000000 00000000 00001100 结果-12
----------------------------------------------------------------------------------------------
这也说明了一个问题:在计算机中,以1开头的就是补码的形式,是负数。
00000000 00000000 00000000 00000110 +6在计算机中表示方法
0000000000 00000000 00000000 00000110 右移两位,正数补0,结果为1
----------------------------------------------------------------------------------------------
00000000 00000000 00000000 00000110 +6在计算机中表示方法
11111111 11111111 11111111 11111001
11111111 11111111 11111111 11111010 -6在计算机中的表示
1111111111 11111111 11111111 11111010 右移两位,结果为负数
1000000000 00000000 00000000 000001
1000000000 00000000 00000000 000010 结果为-2
这个地方很容易弄混,多想几次就会慢慢理解了。
上面解释了带符号的移位操作,下面解释一下不带符号的移位操作
无符号的移位只有右移,没有左移使用“>>>”进行移位,都补充0
例如:
public static void main(String[] args)
{
System.out.println(6>>>2);
System.out.println(-6>>>2);
}
结果:
1
1073741822
分析:
00000000 00000000 00000000 00000110 +6在计算机中表示方法
0000000000 00000000 00000000 00000110 右移两位,正数补0,结果为1
-----------------------------------------------------------------------------------------------------
00000000 00000000 00000000 00000110 +6在计算机中表示方法
11111111 11111111 11111111 11111001
11111111 11111111 11111111 11111010 -6在计算机中的表示
0011111111 11111111 11111111 11111010 右移两位,补充0,结果为1073741822
以下来自:http://jefflee.javaeye.com/blog/203863
可以参考
移位操作要注意的问题是高(低)位是补0还是补1和对char, byte, short型的操作:
(1)<< : (left-shift), 最低位补0
(2)>> : (signed right-shift), 右移过程使用符号位扩展(sign extension),即如果符号为为1则高位补1, 是0则补0,也就是逻辑右移
(3)>>> : (unsigned right-shit),右移过程使用零扩展(zero extension),即最高位一律补0,也就是算术右移
(4)移位操作的数据类型可以是byte, char, short, int, long型,但是对byte, char, short进行操作时会先把它们变成一个int型,最后得到一个int型的结果,对long型操作时得到一个long型结果,不可以对boolean型进行操作。
(5)移位操作符可以和=合并起来,即 <<= 、 >>= 和 >>>=。例如 a >>= 2; 表示将a右移两位后的值重新赋给a。当时在使用这三个操作符对 byte, char, short型数据进行操作时要注意,例如有一下代码片段:
public class ShiftTest {public static void main(String[] args) {byte a;byte b;byte c;a = 127;b = 127;c = 127;a <<= 2;System.out.println(a);System.out.println(b <<= 2);System.out.println(c << 2);} }
运行结果是:
-4
-4
508
这说明了在操作a <<= 2 执行过程是这样的:先将 byte型的数 127变成int型,左移2位得到 508,然后把508赋给byte型变量a时只是简单地"折断"(truncate)得到数-4。编译时编译器不会提示你可能损失精度(实际上在本例中确实是损失精度了),但是如果你把a <<= 2改成 a = a << 2;编译器就会提示可能损失精度了。
================================================================================
移位操作的简单计算方法
>>右移操作
x>>y
就是x除以2的y此方,取整数
<<左移操作
X<<y
就是x乘以2的y次方
转载于:https://www.cnblogs.com/mukekeheart/p/5669353.html
Java基础——左移和右移相关推荐
- Java的左移和右移的含义!
Java的左移(<<)和右移(>>)的含义! 代码: public class test {public static void main(String[] args) {Sy ...
- Java基础篇:右移运算符
右移运算符>>使指定值的所有位都右移规定的次数.它的通用格式如下所示: value >> num 这里,num指定要移位值value移动的位数.也就是,右移运算符>> ...
- 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 ...
- 计算机原理与基础 —— C语言中的左移与右移
1.双目运算符 位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算. 位移位运算符分为左移和右移两种,均为双目运算符. 例如: 8 >> 3 (意思是8向右移动3 ...
- c语言中左移一位 由什么补充,计算机原理与基础 —— C语言中的左移与右移
1.双目运算符 位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算. 位移位运算符分为左移和右移两种,均为双目运算符. 例如: 8 >> 3 (意思是8向右移动3 ...
- 【STM32】位操作、按位与、按位或、按位异或、取反、左移、右移等基础 C 语言知识补充
文章目录 1 位操作 1.1 按位与 1.2 按位或 1.3 按位异或 1.4 取反 1.5 左移 1.6 右移 2 单片机中常用操作 2.1 不改变其他位时,对某几个位设定值 2.2 移位操作提高代 ...
- (JAVA学习笔记) 如何计算2*8效率高(面试题)—— 左移和右移问题。
左移和右移问题 面试题中如何计算(2×8)效率高. 这里的效率肯定是指计算机运算的效率,平常进行计算时直接在代码中写2*8就可以直接得出结果,但是对于计算机而言是无法直接识别的,看似结果出来的很快,但 ...
最新文章
- python如何将列表,字典,元组,集合首字母变成大写 以及其他的大小写转换!
- poj2823 线段树模板题 点修改(也可以用单调队列)
- ES5-拓展 隐式数据类型转换
- Java SimpleTimeZone setStartYear()方法与示例
- 小汤学编程之JavaEE学习day02——Servlet使用步骤、生命周期、接收与返回数据、GET与POST、转发与重定向
- 排序算法之 Shell Sort
- 这段代码很Pythonic | 相见恨晚的 itertools 库
- android安全权限管理,Android 11 中的权限更新
- python语法学习第十天--魔法方法
- JAVA笔试题常见坑_java笔试常见的选择题(坑你没商量)
- 遥感导论网课_经典课程教材遥感导论.pdf
- bottleneck resnet网络_ResNet网络结构分析
- Unity插件——Odin 学习笔记(三)
- oppoR9s计算机使用方法,oppor9s怎么进入Recovery模式
- 小德,真的没想到,去年的千年德三子到现如今的现象级
- 不同局域网之间socket通信
- 跟风“涨价”,品牌老化,为何“0糖”的奥利奥不被消费者买账?
- TileMap插件学习
- 微信记账小程序源码(开源)
- 40个重要的HTML5面试题及答案
热门文章
- 解决windows显示开启HDR后chrome内截图泛白问题
- android sync manager wifi pc,Android SyncManager 实现
- Android Activity的启动模式及对生命周期的影响
- 086_访问html元素
- 大学计算机网络技术考试题,2017年大学生计算机考试的试题
- python数据框添加一列无列名_Python将列添加到数据框导致NaN
- 攻防世界php2_攻防世界-php2
- 大文件做分割处理的方法——winRAR压缩分割法
- python定义私有变量的方法_Python面向对象程序设计之私有变量,私有方法原理与用法分析...
- vue-router 的常见用法