`
huiqinbo
  • 浏览: 344431 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA进制等移位运算[参考于回钦波文库]

阅读更多

JAVA移位运算符

文章分类:Java编程

作者:回钦波 

    移位运算符就是在二进制的基础上对数字进行平移。按照平移的方向和填充数字的规则分为三种:<<(左移)、>>(带符号右移)和>>>(无符号右移)。
  在移位运算时,byte、short和char类型移位后的结果会变成int类型,对于byte、short、char和int进行移位时,规定实际移动的次数是移动次数和32的余数,也就是移位33次和移位1次得到的结果相同。移动long型的数值时,规定实际移动的次数是移动次数和64的余数,也就是移动66次和移动2次得到的结果相同。

      386 以后的硬件把移位对字长进行取模,右移32位就是右移了0位(CPU 把右移的位数 32 对于字长 32 进行取模运算,得到 0),因此 9 右移 32 位仍然是 9。你可以换一下for循环的条件,比如换成i<=64,你会发现结果是一样的。

      三种移位运算符的移动规则和使用如下所示:
  <<运算规则:按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
  语法格式:
  需要移位的数字 << 移位的次数
  例如: 3 << 2,则是将数字3左移2位
  计算过程:
  3 << 2
  首先把3转换为二进制数字0000 0000 0000 0000 0000 0000 0000 0011,然后把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2位,最后在低位(右侧)的两个空位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 1100,则转换为十进制是12.数学意义:
  在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
  >>运算规则:按二进制形式把所有的数字向右移动对应巍峨位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1.
  语法格式:
  需要移位的数字 >> 移位的次数
  例如11 >> 2,则是将数字11右移2位
  计算过程:11的二进制形式为:0000 0000 0000 0000 0000 0000 0000 1011,然后把低位的最后两个数字移出,因为该数字是正数,所以在高位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 0010.转换为十进制是3.
   数学意义:右移一位相当于除2,右移n位相当于除以2的n次方。
  >>>运算规则:按二进制形式把所有的数字向右移动对应巍峨位数,低位移出(舍弃),高位的空位补零。对于正数来说和带符号右移相同,对于负数来说不同。
  其他结构和>>相似。
 
 
 
 
移位例2:
Java代码 复制代码 收藏代码
  1. // 左移: 向左移动,右边补0   
  2. for (int i = 0;i < 8 ;i++)     
  3.     System.out.print( (1 << i) + " ");   
  4. output   
  5. 1 2 4 8 16 32 64 128    
  6.   
  7. // 右移: 向右移动,如果符号位(int型为32位)为0,左边补0,符号位为1,左边补1   
  8. // 符号位为1的右移   
  9. for (int i = 0;i < 8 ;i++)     
  10.     System.out.print( Integer.toHexString(0x40000000 >> i) + " ");   
  11. output   
  12. 40000000 20000000 10000000 8000000 4000000 2000000 1000000 800000    
  13. 回钦波为您详细分析---其实这里的运算过程是这样的:
  14. 1.  0x代表是16进制,暂且不用管它,现在不影响
  15. 2.  40000000 要分解至二进制
  16.      4:0100
  17.        0:0000
  18.          0:0000
  19.            0:0000
  20.              0:0000
  21.                0:0000
  22.                  0:0000
  23.                    0:0000
  24.       也就是把40000000 转化为二进制后的结果是:0100 0000 0000 0000 0000 0000 0000 0000
  25. 3.开始移位:因为是右移,for循环第二次i为1,也就是在40000000 前加一个0,结果是 :
  26.                                                                                   0010 0000 0000 0000 0000 0000 0000 0000
  27.                                                                                      最终结果为:20000000 
  28. 4.开始移位:因为是右移,所以for循环第二次i为2,也就是在40000000 前加一个0,结果是 :
  29.                                                                                   0001 0000 0000 0000 0000 0000 0000 0000
  30.                                                                                      最终结果为:10000000 
  31. 依次是这样算法,,。
  32.   
  33. // 符号位为1的右移   
  34. // 最高4位为1000, 右移1位,变成1100也就是c,   
  35. for (int i = 0;i < 8 ;i++)     
  36.     System.out.print( Integer.toHexString(0x80000000 >> i) + " ");   
  37. output   
  38. 80000000 c0000000 e0000000 f0000000 f8000000 fc000000 fe000000 ff000000  
// 左移: 向左移动,右边补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。现在进行如下测试:
Java代码 复制代码 收藏代码
  1. System.out.println(Integer.toHexString(0x80000000 >> 31));   
  2. // output: ffffffff   
  3. System.out.println(Integer.toHexString(0x80000000 >> 32));   
  4. // output: 80000000  
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,然后再使用上面提到的通用移位运算规则进行移位。

以上是我今天遇到的问题,如果您想更多交流,更多学习请联系QQ:444084929【回钦波】
分享到:
评论

相关推荐

    Java中的进制与移位运算符

    在阅读和分析像"Control_12.java"这样的源码文件时,理解进制转换和移位运算符的原理至关重要,这有助于我们解析代码逻辑,提高代码效率。 总的来说,Java中的进制表示法和移位运算符是程序员必备的技能,它们不仅...

    JAVA基础之java的移位运算

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

    QT进制运算程序

    QT进制运算程序是一款基于QT...总之,"QT进制运算程序"是一个结合了基本计算和进制转换功能的实用工具,它的设计和实现涉及了QT5.9.7框架的多个关键概念和技术,对于学习和实践QT编程的开发者来说具有很高的参考价值。

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

    总的来说,这个运算器移位运算实验是一个综合性的学习体验,它涵盖了数据传输、移位操作、控制信号的使用等多个方面,有助于学生全面理解计算机内部的运算机制。通过这样的实验,学生能够更好地掌握计算机组成原理,...

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

    - 移位运算能显著改变二进制数据的表示,循环移位保留了进位信息,对于算术和逻辑操作具有重要作用。 - 时间复杂度分析显示,移位运算通常比其他算术运算更快,因为它们只需要简单的电路操作即可完成。 5. 问题与...

    C++ 二进制运算

    本文将深入探讨C++中的二进制运算,包括按位与、按位或、按位异或、按位取反以及移位运算等核心操作,并通过具体实例来阐述它们的工作原理及应用场景。 #### 按位与运算 (&) 按位与运算符`&`用于比较两个数的二...

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

    移位运算通常包括左移、右移和循环移位等类型,它们在计算机内部处理二进制数时起着重要作用。在本实验“计算机组成原理实验二-移位运算实验”中,我们将通过EL-JY-II型计算机组成原理实验系统来深入理解这些概念。 ...

    计算机组成原理 移位运算 .ppt

    本资源对计算机组成原理中的移位运算、十进制运算及逻辑运算进行了系统的概括,涵盖了移位运算的基本概念、移位规则、十进制运算和逻辑运算等内容,对计算机组成原理的学习和研究具有重要的参考价值。

    负数移位运算讲解

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

    DEVC++单文件实现十六进制数类运算

    以单文件的形式,实现十六进制数类的构建,并通过运算符重载,定义十六进制数的加减乘除取整等运算。

    移位运算器实验报告

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

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

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

    Java移位运算

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

    Windows关于整数二进制位移运算的MFC程序源代码

    在编程领域,特别是C语言和其派生的MFC(Microsoft Foundation Classes)框架中,整数的二进制位移运算是一种重要的算术操作。位移运算符在处理位模式、数据存储、位掩码以及优化计算等方面发挥着关键作用。本程序源...

    汇编课程设计——用汇编语言进行十六进制四则运算

    为了实现四则运算,需要巧妙地利用移位操作,如左移四位,来存放和操作十六进制数。 【移位操作】 移位操作是汇编语言中的一种常见操作,包括逻辑左移和算术左移。在本设计中,例如要将十六进制数FE34存入BX,会先...

    python实现整数的二进制循环移位

    以及&gt;&gt;运算符实现二进制的左移位以及右移位,然而并没有实现循环移位的运算符,暂时也找不到可以实现循环移位的函数,所以在本文中,主要介绍了如何使用字符的切片运算实现循环位移。 一、实现思路 1、利用字符串的...

    圣克鲁斯加利福尼亚大学的老师Eric Lengyel总结的二进制运算基础

    移位运算是指对二进制数进行移位操作,例如左移、右移等。这些运算可以用来实现各种数据处理操作,例如将二进制数左移一位、将二进制数右移一位等。 在Eric Lengyel老师的总结中,我们可以看到各种二进制运算的公式...

    C51之移位运算

    移位运算是一种基本的位运算,通过将二进制数的每一位向左或向右移动来实现数据的移位。在C51单片机中,可以使用RR、RRC、RL、RLC等指令来实现移位运算,而在C语言中,可以使用和&gt;&gt;等运算符来实现移位运算。 1. ...

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

    在本节中,我们将详细讲解定点数的移位运算,包括算数移位、逻辑移位和循环移位等。 一、引子 在学习定点数的移位运算之前,我们需要了解什么是算数移位。算数移位是一种通过改变小数点的位置来改变数值的运算方式...

    _10基于C语言、线性表的 二、八、十、十六进制转换 及 加运算、左右移位运算、乘法运算 的科学计算器设计_000010.zip

    基于C语言、线性表的 二、八、十、十六进制转换 及 加运算、左右移位运算、乘法运算 的科学计算器设计,主要涉及数据结构相关的知识。详细介绍见文章:...

Global site tag (gtag.js) - Google Analytics