2012-12-08 4 views
5

मेरे पास एक डिवाइस है जिसमें 64 बिट संख्या (डबल) पैरामीटर शामिल हैं। मैं दो हिस्सों में मॉडबस प्रोटोकॉल का उपयोग करके अपने डबल पैरामीटर पढ़ सकता हूं। तो मैंने बिट बिट ऑपरेशन का उपयोग कर 64 बिट संख्या को दो 32 बिट नंबरों में विभाजित किया।32 बिट ओएस पर वीबीस्क्रिप्ट का उपयोग करके मैं 64 बिट डबल नंबर कैसे प्रदर्शित कर सकता हूं?

उदाहरण: 2289225.841082 (दशमलव) = 41417724-EBA8953E (हेक्स)

आप देख सकते हैं और निम्नलिखित साइट में परीक्षण हेक्स बातचीत: उपरोक्त साइट और प्रेस में http://babbage.cs.qc.edu/IEEE-754/ कॉपी 41417724EBA8953E और में पेस्ट "मान विश्लेषण करने के लिए" संपादित करें बॉक्स दर्ज।

लेकिन दो 32 बिट पूर्णांक स्थानांतरित करने के बाद मैं इसे मूल 64 बिट नंबर पर विलय कर सकता हूं। मैंने V12Script में CDbl और FormatNumber फ़ंक्शंस का उपयोग करने का प्रयास किया, लेकिन यह विफल हो गया!

Dim nL, nH, fL, fH, f64 
nL = 1094809380 ' 4141 7724 
nH = 3953694014 ' EBA8 953E 
fL = CDbl($nL) 
fH = CDbl($nH) 
f64 = CDbl((fH * CDbl(2^32)) + CDbl(fL)) 
$strNum64 = FormatNumber(f64, 2) 

तो, मैं 32 बिट ओएस पर वीबीस्क्रिप्ट का उपयोग करके 64 बिट नंबर कैसे प्रदर्शित कर सकता हूं?

उत्तर

1

शुद्ध वीबीस्क्रिप्ट मानते हुए "सरल" जवाब, एक बिग्नम जोड़ने और गुणा लिखना था और फिर उस तरह के उत्तर की गणना करना था।

RosettaCode से कोड का उपयोग करना, मैं निम्नलिखित VeryLargeInteger वर्ग और एक Hex64 समारोह जो कहता है कि 4702170486407730494 64 बिट 0x41417724EBA8953E

की दशमलव बराबर
Option Explicit 
Class VeryLongInteger 
    'http://rosettacode.org/wiki/Long_Multiplication#Liberty_BASIC 
    Public Function MULTIPLY(Str_A, Str_B) 
     Dim signA, signB, sResult, Str_Shift, i, d, Str_T 
     signA = 1 
     If Left(Str_A,1) = "-" Then 
      Str_A = Mid(Str_A,2) 
      signA = -1 
     End If 
     signB = 1 
     If Left(Str_B,1) = "-" Then 
      Str_B = Mid(Str_B,2) 
      signB = -1 
     End If 
     sResult = vbNullString 
     Str_T = vbNullString 
     Str_shift = vbNullString 
     For i = Len(Str_A) To 1 Step -1 
      d = CInt(Mid(Str_A,i,1)) 
      Str_T = MULTBYDIGIT(Str_B, d) 
      sResult = ADD(sResult, Str_T & Str_shift) 
      Str_shift = Str_shift & "0" 
      'print d, Str_T, sResult 
     Next 
     If signA * signB < 0 Then sResult = "-" + sResult 
     'print sResult 
     MULTIPLY = sResult 
    End Function 

    Private Function MULTBYDIGIT(Str_A, d) 
     Dim sResult, carry, i, a, c 
     'multiply Str_A by digit d 
     sResult = vbNullString 
     carry = 0 
     For i = Len(Str_A) To 1 Step -1 
      a = CInt(Mid(Str_A,i,1)) 
      c = a * d + carry 
      carry = c \ 10 
      c = c Mod 10 
      'print a, c 
      sResult = CStr(c) & sResult 
     Next 
     If carry > 0 Then sResult = CStr(carry) & sResult 
     'print sResult 
     MULTBYDIGIT = sResult 
    End Function 

    Public Function ADD(Str_A, Str_B) 
     Dim L, sResult, carry, i, a, b, c 
     'add Str_A + Str_B, for now only positive 
     l = MAX(Len(Str_A), Len(Str_B)) 
     Str_A=PAD(Str_A,l) 
     Str_B=PAD(Str_B,l) 
     sResult = vbNullString 'result 
     carry = 0 
     For i = l To 1 Step -1 
      a = CInt(Mid(Str_A,i,1)) 
      b = CInt(Mid(Str_B,i,1)) 
      c = a + b + carry 
      carry = Int(c/10) 
      c = c Mod 10 
      'print a, b, c 
      sResult = CStr(c) & sResult 
     Next 
     If carry>0 Then sResult = CStr(carry) & sResult 
     'print sResult 
     ADD = sResult 
    End Function 

    Private Function Max(a,b) 
     If a > b Then 
      Max = a 
     Else 
      Max = b 
     End If 
    End Function 

    Private Function pad(a,n) 'pad from right with 0 to length n 
     Dim sResult 
     sResult = a 
     While Len(sResult) < n 
      sResult = "0" & sResult 
     Wend 
     pad = sResult 
    End Function 
End Class 

Function Hex64(sHex) 
    Dim VLI 
    Set VLI = New VeryLongInteger 

    Dim Sixteen(16) 
    Sixteen(0) = "1" 
    Sixteen(1) = "16" 
    Sixteen(2) = VLI.MULTIPLY(Sixteen(1),"16") 
    Sixteen(3) = VLI.MULTIPLY(Sixteen(2),"16") 
    Sixteen(4) = VLI.MULTIPLY(Sixteen(3),"16") 
    Sixteen(5) = VLI.MULTIPLY(Sixteen(4),"16") 
    Sixteen(6) = VLI.MULTIPLY(Sixteen(5),"16") 
    Sixteen(7) = VLI.MULTIPLY(Sixteen(6),"16") 
    Sixteen(8) = VLI.MULTIPLY(Sixteen(7),"16") 
    Sixteen(9) = VLI.MULTIPLY(Sixteen(8),"16") 
    Sixteen(10) = VLI.MULTIPLY(Sixteen(9),"16") 
    Sixteen(11) = VLI.MULTIPLY(Sixteen(10),"16") 
    Sixteen(12) = VLI.MULTIPLY(Sixteen(11),"16") 
    Sixteen(13) = VLI.MULTIPLY(Sixteen(12),"16") 
    Sixteen(14) = VLI.MULTIPLY(Sixteen(13),"16") 
    Sixteen(15) = VLI.MULTIPLY(Sixteen(14),"16") 

    Dim theAnswer, i, theDigit, theMultiplier, thePower, aPower 
    theAnswer = "0" 
    aPower = 0 
    For i = Len(sHex) To 1 Step -1 
     theDigit = UCase(Mid(sHex,i,1)) 
     theMultiplier = InStr("ABCDEF",theDigit)-1 
     thePower = Sixteen(aPower) 
     thePower = VLI.MULTIPLY(CStr(theMultiplier),thePower) 
     theAnswer = VLI.ADD(theAnswer,thePower) 
     aPower = aPower + 1 
    Next 
    Hex64 = theAnswer 
End Function 

WScript.Echo Hex64("41417724EBA8953E") 

मैं कहना है "आनंद" चाहते हैं, लेकिन है बना लिया है मूल पोस्टिंग के बाद से यह छह महीने से अधिक रहा है, इसलिए आपको शायद एक और समाधान मिल गया है। वही, यह मजेदार था।

बाद

Hex64 ऐसा करने के लिए, यदि आप 16 की शक्तियों के precalculation से बचना चाहते हैं अन्य तरीका है:

Function Hex64b(sHex) 
    Dim VLI 
    Set VLI = New VeryLongInteger  
    Dim theAnswer, i, theDigit, theMultiplier, thePower, aPower 
    theAnswer = "0" 
    thePower = "1" 
    For i = Len(sHex) To 1 Step -1 
     theDigit = UCase(Mid(sHex,i,1)) 
     theMultiplier = InStr("ABCDEF",theDigit)-1 
     theAnswer = VLI.ADD(theAnswer,VLI.MULTIPLY(thePower,theMultiplier)) 
     thePower = VLI.MULTIPLY(thePower,"16") 
    Next 
    Hex64b = theAnswer 
End Function 
संबंधित मुद्दे