这里,有Msdn中的一段代码,主要是对一个文件的日期进行处理。代码如下:REM Date is returned in outregs.dx.
REM   Day   : Bits 0-4
REM   Month : Bits 5-8
REM   Year  : Bits 9-15 (from 1980)
Day = outregs.dx AND 31                ' Mask the upper bits
Month = (outregs.dx \ 2 ^ 5) AND 15    ' Shift L 5 & mask upper bits
Year = 1980 + (outregs.dx \ 2 ^ 9)     ' Shift left 9 & add 1980
PRINT "Month ="; Month; "  Day ="; Day; "  Year ="; Year这里,我得到了这样转换后的数据 :     2E  43  , 这里应该得到的数据时: 2007.12.14按照内存布局,我把它转换成 整数是 :  17198 .再转换成二进制是  :    0100001  1001  01110
根据上面所说的,分成了3组。分别对应的是  年、月、日。 问题是  如果按照上面的 算法,我得不到我想要的 2007.12.14 。还有,就是  and 这里的作用! 应该就是取出不同的位置的数据,隐藏更高的位。但我确实是弄不出来。这里,我主要是分析别人的一个用QBasic编写的软件的数据。其中,它保存了当前数据文件的日期。也就是上面的 2E 43 .通过其软件也能够输出 2007.12.14 ,其具体的算法我不清楚。查找资料的时候看到了上面的代码,感觉应该是按照这个算法写的,但是却得不到正确的答案,请哪位给帮忙看看。

解决方案 »

  1.   

    LZ:你以下这句:
    Day = outregs.dx AND 31
    中的:
    outregs.dx
    是啥意思?
      

  2.   

    And 运算符还对两个数值表达式中位置相同的位进行逐位比较,并根据下表对 result 中相应的位进行设置:
    如果在 expression1 的位为 且在 expression2 中的位为 result 为 
                     0                     0                   0 
                   0                     1                   0 
                   1                     0                   0 
                   1                     1                   1
    Private Sub Command1_Click()
        Dim strHex As String
        Dim intSj As Integer
        strHex = "432E"
        intSj = CInt("&H" & strHex)
        Print intSj
        Print intSj And 2 ^ 5 - 1 ' 31 = 2 ^ 5 - 1  (11111)
        Print (intSj \ 2 ^ 5) And 2 ^ 4 - 1 ' 15 = 2 ^ 5 - 1  (1111)
        Print (1980 - 6) + intSj \ 2 ^ 9 ' 2 ^ 9 = 512
    End Sub
      

  3.   

    outregs.dx 的值是如何得到的?没有 Qbasic ,但我在 Quick BASIC 中试了一下。
    outregs.dx 的值是 0。
      

  4.   

    outregs.dx 这个东西随意就可以。3楼,它这里的And比较应该是按位与吧?你的式子能不能写的再明朗一点。对于4楼的说法,我也在怀疑,但是那个程序本身得到的确实是2E 43。不过后面两位跟的是 32 01 。不知道是个什么意思。