位操作的结果与我期望的不一样(50分)

  • 主题发起人 主题发起人 631229
  • 开始时间 开始时间
6

631229

Unregistered / Unconfirmed
GUEST, unregistred user!
今有若干观测记录,每条记录信息为:
Year(年) Month(月) Day(日) Hour(时) Minute(分) Second(秒) ob1 ob2 ob3
ob1 ob2 ob3为3个测项的观测值,均为整数,ob1<999,ob2<100,0<=ob3<=1
我想用一个二进制文件保存它们,用Year、Month、Day、Hour、Minute、Second、ob1、ob2、ob3构成一
个64位整数作为一条记录,年Smallint占16位,月占4位,日占5位,时占5位,分占6位,秒占10位(以整数表
示,例如381代表38.1秒),ob1占10位,ob2占7位,ob3占1位,;
即:
年、月、日、时、分、秒、ob1、ob2、ob3都以二进制表示后,
年后添加48位二进制零+月后添加44位二进制零+日后添加39位二进制零+时后添加34位二进制零
+分后添加28位二进制零+秒后添加39位二进制零+ob1后添加8位二进制零+ob2后添加一位二进制零
ob3=一个64位整数
实现方法:
MyRecord:=(Year shl 48)+(Month shl 44)+(Day shl 39)+(Hour shl 34)+(Minute shl 28)
+(Second shl 18)+(ob1 shl 8)+(ob2 shl 1)+ob3;
但我用一条实际数据
2002年4月12日19时29分380秒(380秒代表38.0秒),ob1=33,ob2=26,ob3=1实验后,这个方法得到的是负数,而且
达不到我的目的:今后打开该文件读数据时,
MyRecord shr 48=年,
(MyRecord shl 16) shr 60=月...等
请问问题出在哪里,有何方法解决?
 
用 double 保存,
TDateTime 与 double 可作转换。
 
用TBits做位操作。
 
改成如此
MyRecord:=(Int64(Year) shl 48)+(Int64(Month) shl 44)+
(Int64(Day) shl 39)+(Int64(Hour) shl 34)+
(Int64(Minute) shl 28)+(Int64(Second) shl 18)+
(Int64(ob1) shl 8)+(Int64(ob2) shl 1)+ob3;
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
625
import
I
I
回复
0
查看
687
import
I
后退
顶部