`
huiqinbo
  • 浏览: 354181 次
  • 性别: 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【回钦波】
分享到:
评论

相关推荐

    《电子技术基础》(数字部分)(第五版)

    1. 数字逻辑基础:书中首先介绍了二进制数制及其运算规则,包括加法、减法、乘法和除法,同时也涵盖了八进制、十六进制与二进制之间的转换。此外,还讲解了布尔代数,它是数字电路分析和设计的基础,用于简化逻辑...

    零拷贝网络编程:RustTokio实现百万级QPS服务.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 Rust 以内存安全、零成本抽象和并发高效的特性,重塑编程体验。无需垃圾回收,却能通过所有权与借用检查机制杜绝空指针、数据竞争等隐患。从底层系统开发到 Web 服务构建,从物联网设备到高性能区块链,它凭借出色的性能和可靠性,成为开发者的全能利器。拥抱 Rust,解锁高效、安全编程新境界!

    PLC与触摸屏控制的流水线贴膜机程序项目完成,涵盖多种控制功能,适合初学者学习简单控制工艺及运动控制,支持博图V13及以上版本。

    内容概要:本文详细介绍了流水线贴膜机的PLC程序和触摸屏程序控制逻辑,涵盖气缸、输送带、伺服电机等关键部件的控制方法。文中通过具体代码示例解释了各个组件的工作原理及其协同运作的方式,如气缸的互锁逻辑、输送带的速度控制以及伺服电机的精确贴膜控制。此外,还强调了HMI界面设计的重要性,提供了报警处理、权限管理和调试技巧等方面的实践经验。 适合人群:工控行业初学者和技术爱好者,尤其是希望深入了解PLC编程和运动控制系统的人员。 使用场景及目标:①帮助读者掌握PLC编程的基本技能,如气缸控制、伺服电机控制等;②提供实际项目的调试经验和常见问题解决方案;③指导读者进行HMI界面设计,确保操作的安全性和便捷性。 其他说明:文章不仅包含了详细的代码示例,还分享了许多来自实际项目的经验教训,有助于读者更好地理解和应用所学知识。

    智能车换道路径规划与行为决策:改良版三维危险势能场建模法的高效应用

    内容概要:本文介绍了一种用于智能车换道路径规划与行为决策的改良版人工势场法。该方法通过引入三维势能场模型,不仅考虑车辆当前的空间位置,还预判了未来3秒内的运动趋势。文中详细描述了动态障碍物处理、车道保持势能场设计以及三维势能场的融合策略。特别是在处理动态障碍物时,采用速度相关的高斯函数,使得车辆能够更好地应对快速接近的障碍物。此外,车道保持势能场通过分段函数设计,在车辆靠近车道边缘时提供更强的回正力矩。三维势能场融合策略则通过加权求和的方式,综合考虑障碍物、车道线和速度等因素,从而提高换道的成功率并减少能耗。 适用人群:从事智能驾驶研究的技术人员、自动驾驶算法开发者、机器人导航领域的研究人员。 使用场景及目标:适用于智能车在复杂交通环境中的换道路径规划与行为决策。主要目标是提高换道成功率、减少能耗、提升乘客舒适度,并解决传统人工势场法中存在的局部极小值和动态障碍物处理难题。 其他说明:该方法已在多个实际场景中进行了测试,如高速公路、山区道路等,均取得了显著的效果。特别是在处理“剪刀车”场景时,能够在短时间内生成符合人类驾驶习惯的避让路径。

    APK包名类名查看工具

    APK包名类名查看工具

    遗传算法优化支持向量机(GA-SVM)在时间序列预测中的应用及基于matlab代码实现

    内容概要:本文详细介绍了利用遗传算法(GA)优化支持向量机(SVM)进行时间序列预测的方法及其MATLAB实现。首先,通过对时间序列数据进行预处理,如标准化和滑动窗口分割,将时间序列转换为监督学习任务。接着,设计遗传算法的染色体结构,采用二进制编码表示SVM的关键参数C和gamma,并通过5折交叉验证的均方误差(MSE)作为适应度函数,确保每一代种群都能朝着更优解进化。文中还分享了一些实践经验,如种群多样性的保持、时间滞后的选择以及参数范围的调整。最后,展示了GA-SVM在不同数据集上的预测效果,并提供了完整的MATLAB代码。 适合人群:从事时间序列预测研究的技术人员,熟悉MATLAB编程环境的研究者。 使用场景及目标:适用于需要高效自动化调参的时间序列预测任务,特别是在面对非线性和高噪声数据时,能够显著提高预测精度。目标是帮助研究人员减少手动调参的工作量,提升模型性能。 其他说明:作者强调了遗传算法在参数优化方面的优势,但也指出其局限性,如可能存在早熟收敛等问题。同时提醒使用者关注数据特性和预处理步骤对最终结果的影响。

    C# Winform 图书管理系统

    内容概要:本文详细介绍了使用C# Winform和ASP.NET开发的一个图书管理系统。系统分为后台和读者端两部分,后台主要用于管理员管理图书、用户和借阅信息,读者端则提供图书查询、借阅和归还等功能。文中展示了具体的代码实现,如图书查询、用户添加、图书入库、借阅功能等,并强调了数据库连接的安全性和性能优化措施,如参数化查询、事务处理、异步加载等。此外,还讨论了一些常见的开发陷阱和最佳实践,如防止SQL注入、使用配置文件管理连接字符串、利用RDLC生成报表等。 适合人群:具有一定C#和ASP.NET基础的开发者,尤其是对Winform桌面应用开发感兴趣的程序员。 使用场景及目标:适用于需要开发类似图书管理系统的项目,帮助开发者理解和掌握Winform应用程序的设计和实现,提高开发效率并确保系统的稳定性和安全性。 其他说明:本文提供了丰富的代码片段和详细的解释,有助于读者快速上手并应用于实际项目中。同时,文中提到的一些优化技巧和注意事项对于提升系统的性能和用户体验也非常有帮助。

    少儿编程scratch项目源代码文件案例素材-厄运洞穴.zip

    少儿编程scratch项目源代码文件案例素材-厄运洞穴.zip

    基于蒙特卡洛模拟的电动汽车日充电负荷Matlab程序:可灵活调整EV数量,随机数据生成

    内容概要:本文详细介绍了利用蒙特卡洛方法在Matlab中模拟电动汽车日充电负荷的方法。通过设定基本参数如电动汽车数量、充电功率、时间步骤等,采用随机函数生成每辆车的充电开始时间和持续时间,进而构建日充电负荷曲线。文中提供了完整的代码实现,包括参数初始化、随机数生成、时间轴处理、负荷叠加及结果可视化。此外,还讨论了模型的改进方向,如引入不同类型电动汽车、考虑充电桩功率限制等。 适合人群:对电力系统、电动汽车充电管理感兴趣的科研人员、工程师及高校学生。 使用场景及目标:适用于研究电动汽车充电对电网负荷的影响,帮助城市规划者评估大规模电动汽车普及后的电力需求,优化充电设施布局。同时,也为智能充电调度系统的开发提供理论依据和技术支持。 其他说明:该模拟方法简单直观,能够快速生成充电负荷曲线,便于理解和应用。尽管模型存在一定简化,但对于初步分析和规划已足够使用。未来可以通过引入更多现实因素提升模型准确性。

    app查看工具.rar

    app查看工具

    基于java开发的菜鸟驿站快递管理系统(客户端+服务端)+源码(毕业设计&课程设计&项目开发)

    基于java开发的菜鸟驿站快递管理系统(客户端+服务端)+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用 基于java开发的菜鸟驿站快递管理系统(客户端+服务端)+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于java开发的菜鸟驿站快递管理系统(客户端+服务端)+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用 基于java开发的菜鸟驿站快递管理系统(客户端+服务端)+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用 基于java开发的菜鸟驿站快递管理系统(客户端+服务端)+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用 基于java开发的菜鸟驿站快递管理系统(客户端+服务端)+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用 基于java开发的菜鸟驿站快递管理系统(客户端+服务端)+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用

    基于自回归整合滑动平均模型(ARIMA)的时间序列预测

    内容概要:本文详细介绍了ARIMA(自回归整合滑动平均模型)在时间序列预测中的应用及其Python实现。文章首先解释了ARIMA的基本概念,即通过历史数据、计算差异和纠正误差来进行预测。接着,通过具体案例展示了如何使用Python进行数据预处理、平稳性检验(如ADF检验)、差分处理、参数选择(如使用ACF/PACF图或auto_arima自动寻优)、模型构建与训练以及最终的预测和可视化。文中强调了ARIMA适用于轻量级任务,在处理非平稳和周期性数据时需要注意的问题,并提供了多个实用技巧和注意事项。 适用人群:对时间序列预测感兴趣的初学者和有一定编程基础的数据分析师、研究人员。 使用场景及目标:帮助读者掌握ARIMA模型的工作原理和实际应用,能够独立完成从数据准备到模型部署的完整流程,特别是在销售预测、经济数据分析等领域。 其他说明:文章不仅提供了详细的代码示例,还分享了许多实践经验,如避免过度差分、处理异常值、选择合适的预测步长等。同时指出ARIMA虽然是经典模型,但在某些情况下可能不如现代深度学习模型表现优异,因此建议结合具体情况灵活选用。

    少儿编程scratch项目源代码文件案例素材-反冲.zip

    少儿编程scratch项目源代码文件案例素材-反冲.zip

    成熟FOC电机控制GD32F1XX全C程序:电动车辆有感控制全开源解决方案

    内容概要:本文详细介绍了基于GD32F1XX系列MCU的全功能FOC(磁场定向控制)电机控制系统的开发过程及其核心技术。主要内容涵盖FOC算法的具体实现步骤,包括Clarke变换、Park变换、PI调节、逆Park变换和SVM调制等;防飞车功能的设计,确保启动安全性;与铁塔王设备通信的协议解析,提高通信效率;以及针对不同国产32位芯片的移植方法。此外,文中还探讨了油门信号处理、EABS电子刹车控制、硬件架构设计等方面的技术细节,并提供了完整的源代码和硬件设计文件供开发者参考。 适合人群:具有一定嵌入式开发经验,特别是对电机控制感兴趣的工程师和技术爱好者。 使用场景及目标:适用于电动两轮车、三轮车及其他小型电动车的控制器开发。主要目标是帮助开发者理解和掌握FOC控制技术,同时提供一个经过实战验证的开源项目作为参考。 其他说明:该项目不仅包含了详细的代码注释和硬件设计资料,还分享了许多实用的经验技巧,如滑动滤波算法的应用、PWM调制的注意事项等。对于希望深入了解工业级电机控制系统的读者来说,这是一个非常有价值的资源。

    Go图像处理库:3天掌握图片解码与GPU加速.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 编译闪电般迅速,并发性能卓越,部署轻松简单!Go 语言以极简设计理念和出色工程性能,成为云原生时代的首选编程语言。从 Docker 到 Kubernetes,全球顶尖科技企业都在采用 Go。点击了解 Go 语言的核心优势、实战窍门和未来走向,开启高效编程的全新体验!

    少儿编程scratch项目源代码文件案例素材-鼓手猴子.zip

    少儿编程scratch项目源代码文件案例素材-鼓手猴子.zip

    基于Matlab的模糊自适应PID控制器仿真算法及MATLAB SIMULINK实现:位置式PID源码提供

    内容概要:本文详细介绍了如何利用Matlab及其SIMULINK工具箱实现模糊自适应PID控制器。首先解释了传统PID控制器的局限性,特别是在应对非线性系统或工况突变时的表现不佳。接着,文章展示了如何构建位置式PID控制器的核心代码,并引入了模糊逻辑来增强PID控制器的自适应能力。文中提供了详细的模糊推理系统的建立步骤,包括定义输入输出变量、隶属函数以及规则库的设计。此外,还讨论了在Simulink中搭建双闭环结构的具体方法,即外部为模糊推理系统用于在线调整PID参数,内部则是常规PID控制器。通过多个仿真实验验证了模糊自适应PID相比传统PID在阶跃响应和平稳性方面的优越表现。 适合人群:自动化专业学生、从事工业自动化领域的工程师和技术人员。 使用场景及目标:适用于需要提升现有PID控制系统性能的场合,特别是那些存在不确定性和复杂性的应用场景。主要目标是帮助读者掌握模糊自适应PID控制器的设计与实现,从而能够应用于实际工程项目中。 其他说明:文章不仅提供了理论讲解,还有具体的代码实现和仿真结果展示,便于读者理解和实践。同时提醒读者在应用过程中需要注意的一些细节,如模糊集合的数量限制、量化因子的选择等。

    信捷PLC 7轴伺服插补联动与牵引示教功能详解

    内容概要:本文详细介绍了基于信捷PLC的七轴伺服插补联动系统的设计与实现。首先,硬件配置方面,利用信捷PLC的脉冲输出口连接多个伺服轴,形成两个轴组进行插补运动。其次,软件层面涵盖了轴组配置指令、插补参数设置、示教功能、配方管理和报警处理等多个方面。文中还特别提到了一些关键技术和技巧,如坐标转换算法、动态补偿算法以及路径优化算法的应用。此外,针对多轴联动常见的运动卡顿和轨迹偏差问题,提出了具体的解决方案,确保设备稳定运行。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程和多轴伺服控制系统有一定了解的专业人士。 使用场景及目标:适用于需要高精度、复杂轨迹控制的工业生产环境,如喷涂车间。主要目标是提高生产效率,减少人工干预,提升产品质量。 其他说明:文章不仅提供了详细的代码示例和技术细节,还分享了许多实用的经验和技巧,帮助读者更好地理解和掌握相关技术。

    2025 长城杯 决赛 二进制 附件 第二届 长城杯 国赛 二进制 附件

    2025 长城杯 决赛 二进制 附件 第二届 长城杯 国赛 二进制 附件

    行人检测与头部识别程序/代码设计,可指导部署树莓派进行配置调试

    内容概要:本文详细介绍了如何在树莓派上实现行人检测与头部识别的技术方案。首先,作者展示了使用OpenCV的HOG特征+SVM方法进行行人检测的基本流程,并讨论了关键参数如winStride的设置及其对性能的影响。接着,引入了BlazeFace轻量级模型用于头部检测,强调了其在移动端的优势。此外,还探讨了YOLOv5n和MobileNet-SSD等深度学习模型的应用,提供了具体的代码示例以及优化建议,如利用OpenCL加速、启用zram交换分区等。最后,分享了一些实际部署过程中遇到的问题及解决方案,包括硬件选择、环境配置等方面的经验。 适合人群:具有一定编程基础和技术背景的研发人员,尤其是对嵌入式设备上的计算机视觉应用感兴趣的开发者。 使用场景及目标:适用于需要在低成本、低功耗平台上实现高效行人检测与头部识别的应用场景,如工地考勤、智能安防等。目标是帮助读者掌握从理论到实践的全过程,能够在类似环境中快速搭建并优化相关系统。 其他说明:文中不仅提供了详细的代码实现,还附带了许多实用的小贴士,如避免HDMI输出拖累性能、合理设置模型输入尺寸等,有助于提高系统的稳定性和效率。同时,也提到了一些常见的错误和陷阱,提醒读者注意规避。

Global site tag (gtag.js) - Google Analytics