- 浏览: 332355 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (249)
- 无废话ExtJs 系列教程 (26)
- jQuery (6)
- 钦波工作后的生活 (5)
- 工作/生活闲谈 (16)
- java基础知识 (44)
- java web (14)
- Struts (1)
- hibernate (8)
- Jpa (0)
- spring (1)
- ajax (3)
- java项目 (4)
- database (5)
- java 流行框架 (5)
- 异常处理 (4)
- 无废话Android系统教程 (6)
- 开发IDE (1)
- 亲自答过的java笔试题 (2)
- oa项目 (4)
- [ 民政局3.0系统 ]--知识点总结分析--与具体项目无关 (0)
- [ 黑龙江低保系统 ]--知识点总结分析--与具体项目无关 (2)
- 工作笔试 (1)
- xml (1)
- telecom项目分析 (13)
- swing (0)
- String运用 (2)
- css (1)
- 页面 (1)
- Html5 (2)
- oracle (4)
- 网站 (1)
- django (1)
- python (4)
- 民航数据中心遇到与解决的问题 (1)
- 平时关注的技术或特效 (1)
- Linux 命令 (2)
- 服务器监控工具 (1)
最新评论
-
wwytwen123:
[*]
java类中静态域、块,非静态域、块,构造函数的初始化顺序(回钦波) -
junying280efun:
yingtao.huang@gmail.com仁兄,麻烦你给我 ...
jBPM Web Designer(jBPM Web 设计器、jBPM 流程设计器、工作流程设计器) -
mobeicanglang:
我觉得楼主的例子全部都有错误,题目明明说的是try{}语句中有 ...
try return finally -
ashy1q:
楼主最后那段代码重复了,写了两遍。知识很详细,很基础,学习了。 ...
java类中静态域、块,非静态域、块,构造函数的初始化顺序(回钦波) -
185552143:
你好!
为什么我这样写p${m.id},会报错的?
能我帮我解 ...
Session问题
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次方。
>>>运算规则:按二进制形式把所有的数字向右移动对应巍峨位数,低位移出(舍弃),高位的空位补零。对于正数来说和带符号右移相同,对于负数来说不同。
其他结构和>>相似。
在移位运算时,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:
- // 左移: 向左移动,右边补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. 0x代表是16进制,暂且不用管它,现在不影响
- 2. 40000000 要分解至二进制
- 4:0100
- 0:0000
- 0:0000
- 0:0000
- 0:0000
- 0:0000
- 0:0000
- 0:0000
- 也就是把40000000 转化为二进制后的结果是:0100 0000 0000 0000 0000 0000 0000 0000
- 3.开始移位:因为是右移,for循环第二次i为1,也就是在40000000 前加一个0,结果是 :
- 0010 0000 0000 0000 0000 0000 0000 0000
- 最终结果为:20000000
- 4.开始移位:因为是右移,所以for循环第二次i为2,也就是在40000000 前加一个0,结果是 :
- 0001 0000 0000 0000 0000 0000 0000 0000
- 最终结果为:10000000
- 依次是这样算法,,。
- // 符号位为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
// 左移: 向左移动,右边补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
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正则表达式经典实例教程[huiqinbo]
2012-03-22 14:38 1736归纳者 : huiqinboaddress : bei ... -
Java多线程同步Synchronized使用并详细分析与实例 【huiqinbo转于网络并总结】
2012-03-09 13:55 3058一.Synchronized基本知识: 在 ... -
今天闲谈下最近写的正则表达式方法,对初学者来说绝对实用【回钦波】
2012-02-03 18:38 828////////////////// test1 ... -
获得到当前方法及类的名字Thread.currentThread().getStackTrace()[0].getClassName();
2011-09-26 13:22 2186获得到当前方法及类的名字: Thread.curren ... -
BufferedReader和BufferedOutputStream之间的灵活应用【回钦波】
2011-09-16 17:44 1023package log; import java.io.Bu ... -
获取c盘下的用户地址System.getProperty("user.home")
2011-09-15 17:09 1081System.getProperty("user.h ... -
为java.util.logging自定义文件处理器及日志输出格式
2011-09-15 17:05 1711为java.util.logging自定义文件处理器及日志输 ... -
jdk log自定义配置文件【回钦波写于20110915】
2011-09-15 17:00 1160import java.io.IOException; ... -
获得本类(java文件)的路径【huiqinbo】this.getClass().getResource("/").getPath()
2011-09-14 15:29 1302package com.huiqinbo; imp ... -
java中ArrayList 、LinkList区别【huiqinbo】
2011-09-08 11:42 1176java中ArrayList 、LinkList、List区 ... -
jdk的logging实例入门学习
2011-09-07 16:40 963jdk的logging实例入门学习 分类: JDK 2 ... -
关于数组new 与不new 的问题
2011-08-30 15:05 775public class Test { String c ... -
Eclipse快捷键大全(huiqinbo)
2011-08-30 11:12 728Ctrl+1 快速修复(最经典 ... -
oracle数据库左右内外连接 【回钦波详解】
2011-08-29 15:00 1146oracle数据库左右内外连 ... -
@SuppressWarnings("**")是什么意思【回钦波详细解答】
2011-08-10 10:55 951很多网友问我(回钦 ... -
很好用的Java反编译软件【回钦波】
2011-04-29 16:49 995有Windows,Linux和Mac OS三个版本可 ... -
java类中静态域、块,非静态域、块,构造函数的初始化顺序(回钦波)
2010-11-05 13:16 2909java类中静态域、块,非 ... -
线程的状态
2010-11-02 09:50 978学习线程《五》——线程的状态 文章分类:Java编程 ja ... -
ArrayList,Vector, LinkedList的存储性能和特性
2010-11-01 13:05 1022ArrayList,Vector, LinkedList的存储 ... -
LinkedHashMap 和 HashMap的区别[软件框架师 回钦波详解]
2010-10-18 23:49 1379...
相关推荐
Java中的进制与移位运算符 Java中的进制与移位运算符
所有的整数类型以二进制数字位的变化及其宽度来表示。例如,byte 型值42的二进制代码是00101010 ,其中每个位置在此代表2的次方,在最右边的位以20开始。向左下一个位置将是21,或2,依次向左是22,或4,然后是8,16...
运算器移位运算实验实验报告.pdf运算器移位运算实验实验报告.pdf运算器移位运算实验实验报告.pdf运算器移位运算实验实验报告.pdf运算器移位运算实验实验报告.pdf运算器移位运算实验实验报告.pdf运算器移位运算实验...
QT5.9.7编写的UI程序工程,解压后即可用QT打开。可以实现数量与单价的输入与计算,以及二进制、十六进制、十进制数字的相互转换。
以单文件的形式,实现十六进制数类的构建,并通过运算符重载,定义十六进制数的加减乘除取整等运算。
计算机组成原理 带移位运算模型机的设计与实现
以及>>运算符实现二进制的左移位以及右移位,然而并没有实现循环移位的运算符,暂时也找不到可以实现循环移位的函数,所以在本文中,主要介绍了如何使用字符的切片运算实现循环位移。 一、实现思路 1、利用字符串的...
基于C语言、线性表的 二、八、十、十六进制转换 及 加运算、左右移位运算、乘法运算 的科学计算器设计,主要涉及数据结构相关的知识。详细介绍见文章:...
主要讲述Java中移位运算,包括:基本数据类型范围、二进制的概念,移位运算符,基本数据类型与二进制之间的转换等。
主要介绍了java基于移位操作实现二进制处理的方法,结合实例形式分析了java针对二进制的移位操作处理技巧,需要的朋友可以参考下
计算机组成原理实验二-移位运算实验.docx计算机组成原理实验二-移位运算实验.docx计算机组成原理实验二-移位运算实验.docx计算机组成原理实验二-移位运算实验.docx计算机组成原理实验二-移位运算实验.docx计算机组成...
二进制4字节移位除法AVR汇编程序,通用型,
这是一个关于测试C语言中整数移位运算的MFC应用程序,界面中标志表示左移或者右移,移位数输入要移的位数,还有输入整数,和输出结果,按钮是用来操作,很方便用来测试
一个简易的计算器(可进行移位求余等运算)
2.了解4位函数发生器74LS181的组合功能,熟悉运算器执行算术操作和逻辑操作的具体实现过程; 3.验证带进位控制的74LS181的功能。 二、实验设备: EL-JY-II型计算机组成原理实验系统一套,排线若干。
通过移位的方法把16进制的字符串转换为10进制的字符串
移位运算实验报告,逻辑移位,循环移位。计算机组成原理实验报告。
计算机组成原理实验,实现函数的时间复杂度分析,思考和小结等,构成完整的实验报告
文中主要讲解了负数移位的实现过程。