java 把64位long,转成2个32位的Int,再回转成long

本文详细介绍了Java中如何将long类型转换为两个int类型,包括转换过程、结果分析及big-endian和little-endian问题。通过实例演示,帮助开发者理解和掌握这种转换的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


java中long是64位,正好可以转成2个32位的int。


项目中正好 要做这种转换,所以,记录一下转换过程。


简单事例:

 long i = 55;
        int i1 = (int) i;
        int i2 = (int) (i << 32);
        System.out.println("i1:" + i1 + ";i2:" + i2);

        long l1 = (i2 & 0x000000ffffffffL) << 32;
        long l2 = i1 & 0x00000000ffffffffL;
        long l = l1 | l2;
        System.out.println("l:" + l);


结果:

i1:55;i2:0
l:55

注意:传递时,big-endian和little-endian问题





嗯,用户想要了解C51单片机如何控制24个流水灯,实现循环转和来回转的效果。首先,我需要确认C51单片机的IO口数量是否足够驱动24个LED。通常C51单片机有4个8IO口,比如P0、P1、P2、P3,每个口有8个引脚,总共32个,理论上足够。但要注意的是,P0口通常需要上拉电阻,因为它是开漏输出。用户可能没有提到硬件连接,但代码中需要指定正确的端口。 接下来,24个流水灯如何连接?假设用户将24个LED分3组,每组8个,分别连接到P0、P1、P2端口。这样每个端口控制8个LED,共24个。需要确保在代码中正确配置这些端口为输出模式,并且初始化时可能需要关闭所有LED,或者根据设计来设置初始状态。 循环转的效果是指LED依次点亮,形单向流动的效果。例如,从P0.0到P0.7,再到P1.0到P1.7,依此类推。来回转则是先从左到右,然后从右到左循环。这需要不同的移方式,可能需要使用循环左移和循环右移指令,或者通过操作实现。 在C语言代码中,通常会使用操作和延时函数。由于C51的移操作是针对8的,处理24可能需要将三个端口的数据组合一个24的变量,或者分别处理每个端口。例如,定义一个无符号长整型变量来存储24的状态,每次移后,将高8、中间8、低8分别赋值给P0、P1、P2。 但需要注意,C51编译器对32数据的处理可能不够高效,特别是在移操作时。因此,另一种方法是分别处理每个端口的移。例如,当循环左移时,先检查P0端口的最高是否为1,如果是,则将P1的最低设为1,并将P0左移一。类似地处理P1到P2,以及P2的最高循环到P0的最低。这样每次移后,三个端口的数据更新,实现24的循环。 来回转则需要改变移方向。可以使用一个标志变量,当单向移动到末尾时,改变方向,开始反向移动。例如,当所有LED都移动到最右边后,开始右移,直到回到最左边,再左移,如此循环。 延时函数通常使用嵌套的for循环来实现,但需要根据单片机的晶振频率调整循环次数,以确保延时合适。例如,12MHz晶振下,一个简单的延时可能需要调整参数,使每个LED的变化肉眼可见,比如大约100毫秒。 另外,需要考虑LED的连接方式是共阳极还是共阴极,这会影响端口的输出电平。假设LED是共阴极,即端口输出高电平时点亮,那么初始化时应将端口设为低电平,关闭所有LED。在代码中,通过向端口写入相应的值来控制LED的亮灭。 可能还需要包含头文件,如reg51.h或reg52.h,以及声明端口。例如,sbit P00 = P0^0; 但更常见的是直接操作整个端口,如P0 = 0x01; 来点亮第一个LED。 用户可能需要代码示例,因此需要提供清晰的注释,解释每一步的作用,特别是移和延时部分。同时,要提醒用户根据实际硬件连接调整端口和延时参数,特别是如果LED连接到不同的端口或使用不同的驱动电路时。 最后,检查代码是否符合C51的语法,比如使用_crol_和_cror_ intrinsics函数来进行循环移,这些函数在intrins.h头文件中定义。例如,使用这些函数可以简化移操作,避免手动处理进。 总结:代码需要初始化三个端口,实现循环左移和来回移的逻辑,使用延时函数控制速度,并循环执行。同时,要确保代码结构清晰,注释详细,方便用户理解和调整。 以下是用C语言实现的C51单片机24个流水灯程序(循环转 + 来回转),包含详细注释和实现原理: ```c #include <reg51.h> #include <intrins.h> // 包含移函数 #define LED_PORT0 P0 #define LED_PORT1 P1 #define LED_PORT2 P2 void delay_ms(unsigned int t); // 延时函数声明 // 主函数 void main() { unsigned char dir = 0; // 方向标志 0:左循环 1:右循环 unsigned long pattern = 0x000001; // 初始模式(24) while(1) { // 循环转模式 for(int i=0; i<24; i++) { // 分解24模式到3个端口 LED_PORT0 = (pattern >> 16) & 0xFF; LED_PORT1 = (pattern >> 8) & 0xFF; LED_PORT2 = pattern & 0xFF; delay_ms(100); pattern = (pattern << 1) | (pattern >> 23); // 循环左移 } // 来回转模式 for(int i=0; i<23; i++) // 右移23次 { LED_PORT0 = (pattern >> 16) & 0xFF; LED_PORT1 = (pattern >> 8) & 0xFF; LED_PORT2 = pattern & 0xFF; delay_ms(100); pattern = dir ? (pattern >> 1) | (pattern << 23) : (pattern << 1) | (pattern >> 23); if(i == 22) dir = !dir; // 反向 } } } // 延时函数(约1ms@12MHz) void delay_ms(unsigned int t) { unsigned int x, y; for(x=t; x>0; x--) for(y=110; y>0; y--); } ``` **硬件连接建议**: 1. 使用P0、P1、P2三个端口共24个IO口 2. 每个IO口接LED(串联470Ω电阻) 3. P0口需要加上拉电阻(10kΩ排阻) **模式说明**: 1. **循环转模式**: - 使用24循环左移 - 数学表达式:$$ pattern = (pattern \ll 1) | (pattern \gg 23) $$ - LED依次从P0.0→P0.7→P1.0→P1.7→P2.0→P2.7循环 2. **来回转模式**: - 采用双向移算法 - 当移动到最右侧后自动反向 - 使用方向标志控制移方向 - 数学表达式:$$ pattern = \begin{cases} (pattern \ll 1) | (pattern \gg 23) & \text{左移} \\ (pattern \gg 1) | (pattern \ll 23) & \text{右移} \end{cases} $$ **注意事项**: 1. 实际延时需根据晶振频率调整 2. 若LED亮度不足,可减小限流电阻值 3. P0口必须外接上拉电阻 4. 完整工程需要包含启动文件ASM代码 完整工程建议使用Keil μVision开发环境,编译时注意选择正确的单片机型号(如AT89C51)。要降这个代码在proteus仿真里面实现,LED的连接应该要注意什么?
最新发布
03-24
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值