`
robertliudeqiang
  • 浏览: 123289 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java 移位运算的陷阱

    博客分类:
  • java
阅读更多
起因:
源于在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%的程序员不会遇到这个问题。
1
0
分享到:
评论

相关推荐

    JAVA基础之java的移位运算

    Java的移位运算涉及到整数类型数据的二进制位操作,这对于理解计算机底层运作和优化代码至关重要。移位运算主要包括左移运算符()和右移运算符(&gt;&gt;,&gt;&gt;&gt;)。在Java中,所有的整数类型(除了char类型外)都是有符号...

    运算器移位运算实验实验报告.pdf

    在计算机组成原理的学习中,运算器移位运算实验是一项至关重要的实践内容,它不仅帮助学生深入理解运算器的工作机制,而且对于数据在计算机中的传输和处理流程的理解起到了重要的桥梁作用。该实验的目的是使学生掌握...

    计算机组成带移位运算实验报告

    计算机组成原理实验报告的核心是理解和应用带移位运算在计算机硬件层面的操作。移位运算在计算机科学中扮演着重要角色,特别是在数据处理和算术运算中。本实验旨在通过设计和实现一个带移位运算的模型机,让学生深入...

    计算机组成原理实验二-移位运算实验.docx

    在计算机组成原理中,移位运算是一种基本的算术和逻辑运算,广泛应用于各种计算和数据处理场景。移位运算通常包括左移、右移和循环移位等类型,它们在计算机内部处理二进制数时起着重要作用。在本实验“计算机组成...

    带移位运算模型机的设计与实现

    带移位运算模型机的设计与实现 本资源摘要信息旨在对带移位运算模型机的设计与实现进行详细的知识点描述。该模型机由微程序控制器控制,通过设计和实现计算机的基本步骤和方法来掌握机器指令的使用和编程。 一、...

    计算机组成原理 实验五 带移位运算模型机的设计与实现

    其中,实验五的主题是“带移位运算模型机的设计与实现”,旨在通过对模型机的设计与调试,加深学生对微程序控制器以及数据通道控制的理解。 首先,让我们来明确一下实验的目标。实验的主要目的是通过设计与实现一款...

    Java移位运算

    ### Java移位运算详解 #### 一、基本概念与数据类型范围 在深入探讨Java中的移位运算之前,我们先来了解一下基本的数据类型及其范围。 ##### 1. 基本类型取值范围 Java中提供了多种基本数据类型,如`byte`、`...

    移位运算器实验报告

    移位运算器是一种重要的数字逻辑电路,主要用于处理二进制数据的移位操作。移位操作在计算机科学和数字电子领域中广泛应用,包括数据处理、算术运算、串行通信等场景。本实验报告主要围绕74LS299芯片进行,这是一种...

    负数移位运算讲解

    ### 负数移位运算详解 在计算机科学与编程领域中,移位运算是一个非常重要的概念。本文将深入探讨C语言中的负数移位运算,并通过具体的例子来解释其实现过程。移位运算包括左移(`)和右移(`&gt;&gt;`)两种类型。 ####...

    java 移位运算符的资源

    而Java.jpg可能是一个与课程或教程相关的图片,展示了一些移位运算的例子或图解,帮助学习者更好地理解这一概念。 总的来说,Java的移位运算符是编程中不可或缺的工具,它们提供了对二进制位的直接控制,能够实现...

    C51之移位运算

    C51之移位运算 C51之移位运算是指在C51单片机中实现移位运算的方法。移位运算是一种基本的位运算,通过将二进制数的每一位向左或向右移动来实现数据的移位。在C51单片机中,可以使用RR、RRC、RL、RLC等指令来实现...

    广东工业大学计组实验报告带移位运算模型机的设计与实现五

    广东工业大学的计组实验报告,以“带移位运算模型机的设计与实现五”为主题,详细探讨了移位运算和微程序控制器相结合的实验过程。本次实验不仅旨在加深学生对微程序控制器及其控制数据通道的理解,而且还着重于使...

    计算机组成原理 课设任务书--基本模型机和带移位运算的模型机设计与实现

    本任务书的核心是构建“基本模型机”和“带移位运算的模型机”,旨在帮助学生掌握计算机硬件设计的基础知识,理解数据在计算机中的表示、存储和处理方式,以及指令系统的构造原理。 首先,我们要讨论基本模型机的...

    计算机组成原运算器及移位运算器实验报告

    2.了解4位函数发生器74LS181的组合功能,熟悉运算器执行算术操作和逻辑操作的具体实现过程; 3.验证带进位控制的74LS181的功能。 二、实验设备: EL-JY-II型计算机组成原理实验系统一套,排线若干。

    计算器(可进行移位求余等运算)

    一个简易的计算器(可进行移位求余等运算)

    计算机组成原理之定点数的移位运算

    "计算机组成原理之定点数的移位运算" 定点数的移位运算是计算机组成原理中的一种重要运算方式。在本节中,我们将详细讲解定点数的移位运算,包括算数移位、逻辑移位和循环移位等。 一、引子 在学习定点数的移位...

    Java利用移位运算将int型分解成四个byte型的方法

    "Java利用移位运算将int型分解成四个byte型的方法" 以下是 Java 中利用移位运算将 int 型分解成四个 byte 型的方法相关知识点: 知识点 1:移位运算 在 Java 中,移位运算是指将一个数字移动到特定的位数,以便...

Global site tag (gtag.js) - Google Analytics