首先要明白一点,这里面所有的操作都是针对存储在计算机中中二进制的操作,那么就要知道,正数在计算机中是用二进制表示的,负数在计算机中使用补码表示的。

左移位:<<,有符号的移位操作
  左移操作时将运算数的二进制码整体左移指定位数,左移之后的空位用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基础——左移和右移相关推荐

  1. Java的左移和右移的含义!

    Java的左移(<<)和右移(>>)的含义! 代码: public class test {public static void main(String[] args) {Sy ...

  2. Java基础篇:右移运算符

    右移运算符>>使指定值的所有位都右移规定的次数.它的通用格式如下所示: value >> num 这里,num指定要移位值value移动的位数.也就是,右移运算符>> ...

  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. 计算机原理与基础 —— C语言中的左移与右移

    1.双目运算符 位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算. 位移位运算符分为左移和右移两种,均为双目运算符. 例如: 8  >>  3   (意思是8向右移动3 ...

  7. c语言中左移一位 由什么补充,计算机原理与基础 —— C语言中的左移与右移

    1.双目运算符 位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算. 位移位运算符分为左移和右移两种,均为双目运算符. 例如: 8  >>  3   (意思是8向右移动3 ...

  8. 【STM32】位操作、按位与、按位或、按位异或、取反、左移、右移等基础 C 语言知识补充

    文章目录 1 位操作 1.1 按位与 1.2 按位或 1.3 按位异或 1.4 取反 1.5 左移 1.6 右移 2 单片机中常用操作 2.1 不改变其他位时,对某几个位设定值 2.2 移位操作提高代 ...

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

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

最新文章

  1. python如何将列表,字典,元组,集合首字母变成大写 以及其他的大小写转换!
  2. poj2823 线段树模板题 点修改(也可以用单调队列)
  3. ES5-拓展 隐式数据类型转换
  4. Java SimpleTimeZone setStartYear()方法与示例
  5. 小汤学编程之JavaEE学习day02——Servlet使用步骤、生命周期、接收与返回数据、GET与POST、转发与重定向
  6. 排序算法之 Shell Sort
  7. 这段代码很Pythonic | 相见恨晚的 itertools 库
  8. android安全权限管理,Android 11 中的权限更新
  9. python语法学习第十天--魔法方法
  10. JAVA笔试题常见坑_java笔试常见的选择题(坑你没商量)
  11. 遥感导论网课_经典课程教材遥感导论.pdf
  12. bottleneck resnet网络_ResNet网络结构分析
  13. Unity插件——Odin 学习笔记(三)
  14. oppoR9s计算机使用方法,oppor9s怎么进入Recovery模式
  15. 小德,真的没想到,去年的千年德三子到现如今的现象级
  16. 不同局域网之间socket通信
  17. 跟风“涨价”,品牌老化,为何“0糖”的奥利奥不被消费者买账?
  18. TileMap插件学习
  19. 微信记账小程序源码(开源)
  20. 40个重要的HTML5面试题及答案

热门文章

  1. 解决windows显示开启HDR后chrome内截图泛白问题
  2. android sync manager wifi pc,Android SyncManager 实现
  3. Android Activity的启动模式及对生命周期的影响
  4. 086_访问html元素
  5. 大学计算机网络技术考试题,2017年大学生计算机考试的试题
  6. python数据框添加一列无列名_Python将列添加到数据框导致NaN
  7. 攻防世界php2_攻防世界-php2
  8. 大文件做分割处理的方法——winRAR压缩分割法
  9. python定义私有变量的方法_Python面向对象程序设计之私有变量,私有方法原理与用法分析...
  10. vue-router 的常见用法