java移位运算_Java移位运算符 “
详解
首先举一个样例来说明不是循环移位:
假设上面的程序改为
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移位运算符 “相关推荐
- java比较运算_Java比较运算符
注意哦: 1. > . < . >= . <= 只支持左右两边操作数是数值类型 2. == . != 两边的操作数既可以是数值类型,也可以是引用类型 public clas ...
- java 基础运算_Java 基础 运算符
Java运算符 运算符:是一种用于对数据进行运算,赋值,比较的特殊符号. Java语言中运算符总共分为以下几大类: 算术运算符:+ - * / ++ -- 示例如下代码: 1 public class ...
- Java二进制位运算、移位运算、、
为什么80%的码农都做不了架构师?>>> Java二进制位运算.移位运算 思考题 1.请看下面的代码段,回答a,b,c,d,e结果是多少? public static void ...
- Java位运算之移位运算
文章目录 移位运算 左移 << 位运算符 右移 >> 位运算符 无符号右移 >>> 运算符 移位运算 移位运算符在程序设计中,是位操作运算符的一种.移位运算符 ...
- java 对数运算_Java语言 第二章 运算和语句
1.数据运算 运算由表达式表示,表达式由运算符和运算分量组成,运算分量可以是常量.变量和方法调用Java基本运算分类图 1.1 赋值运算 1.1.1 简单赋值运算变量 = 表达式 程序执行过程: (1 ...
- PC_二进制移位运算/定点数移位/算数移位及其移位后的空位添补规则/机器数位数扩充
文章目录 定点数位数扩充(补齐) 正数的机器码扩充 负数的机器码扩充 原码 反码 补码 定点数的移位运算 算数移位 算数移位的实质 逻辑移位 对比算数移位 例 循环移位 二进制移位操作
- java 位与运算_java中位运算和移位运算详解
一.位运算 (1)按 位 与 & 如果两个相应的二进制形式的对应的位数都为1,则结果为1,记为同1为1,否则为0.首先我们看一下对正数的运算 分别看一下正数和负数的具体运算步骤 正数直接取二进 ...
- java 乘法 位移_Java:移位实现的乘除法
以下文章仅用于记录工作学习过程中的学习心得. 在Java的运算中,移位实现的乘除法运算比直接乘除法的效率高得多 符号: < >> : 除 举例子: a= a * 8 = a * ...
- java mod 运算_java中基本运算符
java中的位运算符及其用法. java中的位运算符及其用法.请一一解释一下.包括例子 位逻辑运算符有"与"(AND)."或"(OR)."异或(XOR ...
- java中 移位运算_java中关于移位运算符的demo与总结(推荐)
首先,移位运算符有三种,其操作类型只支持:byte / short / char / int和long五种. << 左移运算符,表示将左边的操作数的二进制数据向左移动*位,移动后空缺位以0 ...
最新文章
- 【c语言】蓝桥杯算法提高 3-2字符串输入输出函数
- 各种pytorch项目
- Java面向对象之继承,方法重写,super关键字,员工类系列继承题
- SSL协议、HTTP和HTTPS和区别
- 语义分割的时候,发的牢骚
- supervisor配置文件中如何添加多个环境变量
- 25 To Life
- extjs4动态生成多表头
- Ubuntu下安装Python3(与旧Python2版本共存)
- [Ext JS] 3.3 树(Tree)的定义和使用
- 清理清理火狐历史记录
- LeetCode 260. Single Number III
- 别人的Python爬虫代码能读懂,自己却还是不能自由去爬?社群日报
- 32位计算机怎么安装ps,我可以在64位系统上安装32位Photoshop吗?
- Altera FPGA 差分信号初识(3)
- Ubuntu 关闭 onboard (屏幕键盘应用)开机自启
- 交换机和路由器的区别_交换机和路由器有什么区别 交换机和路由器区别介绍【详解】...
- 桌上游戏(桌面游戏)入门指南
- 空间几何(点线面)知识整理
- 互联网公司数据安全保护新探索