起因:
源于在java.util.BitSet的源码中发现这样一条语句:
1L << bitIndex
当bitIndex为64时,上面语句的返回值为1,据此猜测java的移位运算使用的是循环移位规则,内容可以参考上一篇博客 "JDK源码 - BitSet的实现"
http://robblog.iteye.com/admin/blogs/568845
上面的结论是错误的。先说说教科书上说的移位运算:
// 左移: 向左移动,右边补0
for (int i = 0;i < 8 ;i++)
System.out.print( (1 << i) + " ");
output
1 2 4 8 16 32 64 128
// 右移: 向右移动,如果符号位(int型为32位)为0,左边补0,符号位为1,左边补1
// 符号位为1的右移
for (int i = 0;i < 8 ;i++)
System.out.print( Integer.toHexString(0x40000000 >> i) + " ");
output
40000000 20000000 10000000 8000000 4000000 2000000 1000000 800000
// 符号位为1的右移
// 最高4位为1000, 右移1位,变成1100也就是c,
for (int i = 0;i < 8 ;i++)
System.out.print( Integer.toHexString(0x80000000 >> i) + " ");
output
80000000 c0000000 e0000000 f0000000 f8000000 fc000000 fe000000 ff000000
上面的通用法则没有错,但是有一个限制,对int型,移位的位数不超过32,对long型,移位的位数不超过64。现在进行如下测试:
System.out.println(Integer.toHexString(0x80000000 >> 31));
// output: ffffffff
System.out.println(Integer.toHexString(0x80000000 >> 32));
// output: 80000000
0x80000000在右移31位后,每个位都成了1(也就是-1),按照这个想法,右移32位理所当然的还是-1,可是右移32位后,得到的结果却又这个数本身。
通过对int,long类型数据左右移进行测试,发现:
java对移位运算"a <<||>> b"的处理,首先做 b mod 32||64运算, 如果a是int型,取mod 32,如果a是double型,取mod 64,然后再使用上面提到的通用移位运算规则进行移位。
到这里,就可以理解为什么在BitSet类中是
1L << bitIndex
这条语句,因为熟悉jdk的Programer知道,再写 1L << (bitIndex % 64) 对jdk来说是多余的。
处理的规则发现了,但仍然有个疑问:
- jdk为什么这样做? 虽然90%的程序员不会遇到这个问题。
分享到:
相关推荐
运算器移位运算实验实验报告.pdf运算器移位运算实验实验报告.pdf运算器移位运算实验实验报告.pdf运算器移位运算实验实验报告.pdf运算器移位运算实验实验报告.pdf运算器移位运算实验实验报告.pdf运算器移位运算实验...
对byte 和short类型的值进行移位运算的结果是int 型,而且如果左移不超过31位,原来对应各位的值也不会丢弃。但是,如果你对一个负的byte 或者short类型的值进行移位运算,它被扩大为int 型后,它的符号也被扩展。...
计算机组成原理 带移位运算模型机的设计与实现
计算机组成原理实验二-移位运算实验.docx计算机组成原理实验二-移位运算实验.docx计算机组成原理实验二-移位运算实验.docx计算机组成原理实验二-移位运算实验.docx计算机组成原理实验二-移位运算实验.docx计算机组成...
java 移位运算符 java 移位运算符 java 移位运算符
主要讲述Java中移位运算,包括:基本数据类型范围、二进制的概念,移位运算符,基本数据类型与二进制之间的转换等。
2.了解4位函数发生器74LS181的组合功能,熟悉运算器执行算术操作和逻辑操作的具体实现过程; 3.验证带进位控制的74LS181的功能。 二、实验设备: EL-JY-II型计算机组成原理实验系统一套,排线若干。
这是一份个人写的广东工业大学计算机组成原理 实验六 复杂模型机的设计与实现,希望和大家共享一下自己的知识成果,对大家学习有所启发和帮助。
移位运算实验报告,逻辑移位,循环移位。计算机组成原理实验报告。
计算机组成原理实验,实现函数的时间复杂度分析,思考和小结等,构成完整的实验报告
文中主要讲解了负数移位的实现过程。
一个简易的计算器(可进行移位求余等运算)
广东工业大学 计算机组成原理实验5 带移位运算模型机的设计与实现
C51之移位运算
移位运算器实验报告.docx移位运算器实验报告.docx移位运算器实验报告.docx移位运算器实验报告.docx移位运算器实验报告.docx移位运算器实验报告.docx移位运算器实验报告.docx移位运算器实验报告.docx
一个很好的计算机组成原理 课设任务书--基本模型机和带移位运算的模型机设计与实现
自己刚刚做过实验,很实用哦 内容不是太多,A4纸就三页 但是你懂的,浓缩的都是!!
1.实验目的与要求: (1)熟悉由微程序控制器控制模型机的数据通道。 (2)掌握机器指令的使用和...本实验是在基本模型机的基础上搭接移位控制电路,实现移位控制运算。 带移位模型机数据通道框图如图5-1所示: ……
【IT十八掌徐培成】Java基础第02天-04.运算符-移位运算-逻辑运算.zip
这是大三的课程设计,我们老师说要有任务书,目录,封面,正文,都有,下了直接打印就可以了。