详解

首先举一个样例来说明不是循环移位:

假设上面的程序改为

i = 3L << 63

程序的结果仍然为

1000000000000000000000000000000000000000000000000000000000000000

那么就说明Java中的移位运算不是循环的。

那对上面的问题又怎么解释呢?

在JLS(Java Language Specific 15.19)中有例如以下解释:If the promoted type of the left-hand operand is int, only the five lowest-order bits of the right-hand operand are used as the shift distance. It is as if the right-hand operand were subjected to a bitwise logical AND operator & (§15.22.1) with the mask value 0x1f (0b11111). The shift distance actually used is therefore always in the range 0 to 31, inclusive.

If the promoted type of the left-hand operand is long, then only the six lowest-order bits of the right-hand operand are used as the shift distance. It is as if the right-hand operand were subjected to a bitwise logical AND operator & (§15.22.1) with the mask value 0x3f (0b111111). The shift distance actually used is therefore always in the range 0 to 63, inclusive.

意思是说:在移位运算中,假设被移位的操作数是int类型的,那么仅仅会用到移位数的最低5位,假设是long类型的,那么仅仅会用到低六位。

那么为什么是低5位和低6位呢?相信你应该明确了,int共占32位,long占64位,正好是2的5次幂和6次幂。能够理解为分别对32 和 64 取模。所以1L << 64 就会变成 1L << 0。结果自然就是1了。

关于网上的说法:

网上有很多资料说上述定义是由编译器完毕的,即假设写 1L << 64 。则编译器会将文件编译为  1L << 0 。可是经过本人的实验发现这个过程会发生在执行时而不是编译位class文件的过程。以下是个人所做的一些实验。

实验过程:

将程序编译为class文件

使用javap输出class文件的内容

使用HSDIS输出虚拟机执行的汇编代码

源程序:

public class SF{

public static void main(String[] args) {

new SF().sh(1,2);

}

public int sh(int a , int b){

return (a << 32);

}

}

注意此处使用的是int类型

在windows环境下的批处理文件

javac SF.java

javap -verbose SF > sfp.txt

java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -Xcomp -XX:CompileCommand=dontinline,*SF.sh -XX:CompileCommand=compileonly,*SF.sh SF > sfasm.txt

pause

这里须要用到HSDIS插件才干输出汇编代码。

以下是javap的结果。

iload_1 为取得參数a,在栈中push  32  后,进行移位操作。ishl中的i指代的是int的移位操作。

再看反汇编的输出:

[Verified Entry Point]

0x01c92e50: mov %eax,-0x4000(%esp)

0x01c92e57: push %ebp

0x01c92e58: sub $0x18,%esp ;*iload_1

; - SF::sh@0 (line 7)

0x01c92e5b: shl $0x0,%edx

0x01c92e5e: mov %edx,%eax

0x01c92e60: add $0x18,%esp

0x01c92e63: pop %ebp

0x01c92e64: test %eax,0x140100 ; {poll_return}

看到在分配完栈空间后,在0x01c92e5b这一行中,进行了移位。操作数为0x0

java移位运算_Java移位运算符 “相关推荐

  1. java比较运算_Java比较运算符

    注意哦: 1.  > . < . >= . <= 只支持左右两边操作数是数值类型 2.  == . != 两边的操作数既可以是数值类型,也可以是引用类型 public clas ...

  2. java 基础运算_Java 基础 运算符

    Java运算符 运算符:是一种用于对数据进行运算,赋值,比较的特殊符号. Java语言中运算符总共分为以下几大类: 算术运算符:+ - * / ++ -- 示例如下代码: 1 public class ...

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

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

  4. Java位运算之移位运算

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

  5. java 对数运算_Java语言 第二章 运算和语句

    1.数据运算 运算由表达式表示,表达式由运算符和运算分量组成,运算分量可以是常量.变量和方法调用Java基本运算分类图 1.1 赋值运算 1.1.1 简单赋值运算变量 = 表达式 程序执行过程: (1 ...

  6. PC_二进制移位运算/定点数移位/算数移位及其移位后的空位添补规则/机器数位数扩充

    文章目录 定点数位数扩充(补齐) 正数的机器码扩充 负数的机器码扩充 原码 反码 补码 定点数的移位运算 算数移位 算数移位的实质 逻辑移位 对比算数移位 例 循环移位 二进制移位操作

  7. java 位与运算_java中位运算和移位运算详解

    一.位运算 (1)按 位 与 & 如果两个相应的二进制形式的对应的位数都为1,则结果为1,记为同1为1,否则为0.首先我们看一下对正数的运算 分别看一下正数和负数的具体运算步骤 正数直接取二进 ...

  8. java 乘法 位移_Java:移位实现的乘除法

    以下文章仅用于记录工作学习过程中的学习心得. 在Java的运算中,移位实现的乘除法运算比直接乘除法的效率高得多 符号: < >>   :  除 举例子: a= a * 8 = a * ...

  9. java mod 运算_java中基本运算符

    java中的位运算符及其用法. java中的位运算符及其用法.请一一解释一下.包括例子 位逻辑运算符有"与"(AND)."或"(OR)."异或(XOR ...

  10. java中 移位运算_java中关于移位运算符的demo与总结(推荐)

    首先,移位运算符有三种,其操作类型只支持:byte / short / char / int和long五种. << 左移运算符,表示将左边的操作数的二进制数据向左移动*位,移动后空缺位以0 ...

最新文章

  1. 【c语言】蓝桥杯算法提高 3-2字符串输入输出函数
  2. 各种pytorch项目
  3. Java面向对象之继承,方法重写,super关键字,员工类系列继承题
  4. SSL协议、HTTP和HTTPS和区别
  5. 语义分割的时候,发的牢骚
  6. supervisor配置文件中如何添加多个环境变量
  7. 25 To Life
  8. extjs4动态生成多表头
  9. Ubuntu下安装Python3(与旧Python2版本共存)
  10. [Ext JS] 3.3 树(Tree)的定义和使用
  11. 清理清理火狐历史记录
  12. LeetCode 260. Single Number III
  13. 别人的Python爬虫代码能读懂,自己却还是不能自由去爬?社群日报
  14. 32位计算机怎么安装ps,我可以在64位系统上安装32位Photoshop吗?
  15. Altera FPGA 差分信号初识(3)
  16. Ubuntu 关闭 onboard (屏幕键盘应用)开机自启
  17. 交换机和路由器的区别_交换机和路由器有什么区别 交换机和路由器区别介绍【详解】...
  18. 桌上游戏(桌面游戏)入门指南
  19. 空间几何(点线面)知识整理
  20. 互联网公司数据安全保护新探索

热门文章

  1. matlab 多项式画图,matlab多项式画图
  2. Linux下黑客帝国代码雨
  3. power bi 雷达图_【深度解析】基于激光雷达技术的车型识别方法及系统实现
  4. C++实现中值滤波算法
  5. 51单片机简谱音乐3-音阶与频率表问题以及简谱小笔记
  6. 【论文解读】AVOD-Net 用于自动驾驶的聚合视图3D对象检测网络
  7. 基于51单片机中文汉字LCD12864滚动显示屏仿真(源码+仿真+全套资料)
  8. 数字信号处理及其MATLAB实现总结
  9. 04735数据库系统原理(知识点整合)
  10. 使用vb脚本实现钉钉重复发送10条消息