2017-07-24 19 views
5

मैं एक संख्या है बिना बूलियन के लिए/बिट सरणी (जैसे 5) जो मैं पहली बार बाइनरी (101) कन्वर्ट करने के लिए चाहते हैं और उसके बाद VBAपूर्णांक पाशन

में बिट्स {1,0,1} या Booleans {True,False,True} की एक सरणी में विभाजित

है लूपिंग के बिना ऐसा करने का कोई तरीका है?

मैं कार्यपत्रक सूत्र के साथ अपने कोड में पाशन के बिना बाइनरी में बदल सकते हैं के रूप में

myBinaryNum = [DEC2BIN(myDecInteger,[places])] 

इस प्रकार है लेकिन मुझे बताया गया है कि कार्यपत्रक काम करता है, बहुत अक्षम हैं और यह एक विशेष रूप से सीमित है।

मुझे यकीन नहीं है कि MID के साथ अंकों के माध्यम से लूप किए बिना सरणी में कैसे विभाजित किया जाए। क्या संख्याओं के लिए strConv जैसी कोई चीज है?

उत्तर

4

चाहते हैं तो आप पहले के मूल्य में परिवर्तित कर सकते हैं एक " 01 "WorksheetFunction.Dec2Bin के साथ स्ट्रिंग। तो कोड 0 या 1 के साथ प्रत्येक "0", "1" की जगह है और एक Byte सरणी के लिए परिणाम डाली:

Public Function ToBitArray(ByVal value As Long) As Byte() 
    Dim str As String 
    str = WorksheetFunction.Dec2Bin(value)     ' "101" 
    str = Replace(Replace(str, "0", ChrW(0)), "1", ChrW(1)) ' "\u0001\u0000\u0001" 
    ToBitArray = StrConv(str, vbFromUnicode)     ' [1, 0, 1] 
End Function 

लेकिन Dec2Bin 511 तक ही सीमित है और तार के साथ काम करने के बजाय महंगा है। तो अपने लक्ष्य को सबसे अच्छा प्रदर्शन प्राप्त करने के लिए है, तो आप एक पाश प्रत्येक बिट पढ़ने के लिए उपयोग करना चाहिए:

Public Function ToBitArray(ByVal value As Long) As Byte() 
    Dim arr(0 To 31) As Byte, i As Long 
    i = 32& 

    Do While value 
    i = i - 1 
    arr(i) = value And 1 
    value = value \ 2 
    Loop 

    ToBitArray = MidB(arr, i + 1) ' trim leading zeros 
End Function 
+0

नौसिखिए सवाल है, अपने दूसरे समाधान में (एक साथ है लूप), 'i = 32 ** और **' का अर्थ क्या है, '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' है , मुझे सच में यकीन नहीं है कि इसका क्या अर्थ है? – Greedo

+1

'32 और' का अर्थ है कि 32 को 'लांग' के रूप में उपयोग किया जाता है। '32' अकेले 'इंटेगर' के रूप में प्रयोग किया जाता है। यह तब उपयोगी होता है जब मान को एक संस्करण में असाइन किया जाता है और जब आपको 'लांग' रखने या ऑपरेशन पर ओवरफ़्लो से बचने के लिए इसकी आवश्यकता होती है। इससे कोई फर्क नहीं पड़ता क्योंकि यह स्वचालित रूप से 'i' के प्रकार में परिवर्तित हो जाता है जो 'लांग' है। –

1

मुझे SO पर एक और प्रश्न here पर यह साफ कोड मिला। असल में, आप सुनिश्चित कर सकते हैं कि आपकी स्ट्रिंग ASCII है क्योंकि यह 1 और 0 है।

तुम क्या आप

Dim my_string As String 

my_string = CStr("your binary number") 

का उपयोग एक स्ट्रिंग में अपने द्विआधारी संख्या चालू करने के लिए

और फिर

Dim buff() As String 
buff = Split(StrConv(my_string, vbUnicode), Chr$(0)) 
ReDim Preserve buff(UBound(buff) - 1 

एक सरणी में कि स्ट्रिंग विभाजित करने के लिए जहां शौकीन अपने सरणी है

0

Application.Dec2Bin(n) को आमंत्रित करना वास्तव में महंगा नहीं है, यह ऑनल है वाई देर से बाध्य कॉल खर्च करता है। बिट्स की एक विन्यास में, किसी भी पूर्णांक को बदलने के लिए नीचे दिए गए समारोह का उपयोग करें:

Function Bits(n as long) 
    Dim s As String: s = Application.Dec2Bin(n) 
    Dim ar: ar = Split(StrConv(s, vbUnicode), vbNullChar) 
    Bits = ar 
End Function 

पी.एस .: s केवल 0 और 1 जो ASCII वर्ण हैं में शामिल होंगे, तो विभाजन तकनीक पूरी तरह से वैध है।

-1

इस कोड की जांच करें अगर यह तुम क्या जरूरत है: आप किसी भी सेल मूल्य संदर्भ द्वारा अंक 5 की जगह ले सकता, यह सिर्फ और उदाहरण:

Sub dectobinary() 
Dim BinaryString As String 

BinaryString = "5" 

tempval = Dec2Bin(BinaryString) 

MsgBox tempval 

End Sub 


Function Dec2Bin(ByVal DecimalIn As Variant) As String 
Dec2Bin = "" 
DecimalIn = Int(CDec(DecimalIn)) 
Do While DecimalIn <> 0 
    Dec2BinTemp = Format$(DecimalIn - 2 * Int(DecimalIn/2)) 
     If Dec2BinTemp = "1" Then 
      Dec2Bin = "True" & "," & Dec2Bin 
     Else 
      Dec2Bin = "False" & "," & Dec2Bin 
     End If 
    DecimalIn = Int(DecimalIn/2) 
Loop 
End Function 
+1

इस समाधान एक पाश – jsotola

-1

बस अपने इच्छित संख्या lngNumber मान परिवर्तित

Public Sub sChangeNumberToBinaryArray() 

Dim strBinaryNumber As String 
Dim strBinaryArray() As String 
Dim lngNumber As Long 

    lngNumber = 5 

    strBinaryNumber = DecToBin(lngNumber) 
    strBinaryArray() = Split(strBinaryNumber, "|") 

End Sub 

समारोह DecToBin (ByVal varDecimalIn उपादानों के रूप में) के रूप में स्ट्रिंग

Dim lngCounter As Long 

    DecToBin = "" 
    varDecimalIn = Int(CDec(varDecimalIn)) 
    lngCounter = 1 
    Do While varDecimalIn <> 0 
     If lngCounter = 1 Then 
      DecToBin = Format$(varDecimalIn - 2 * Int(varDecimalIn/2)) & DecToBin 
      lngCounter = lngCounter + 1 
     Else 
      DecToBin = Format$(varDecimalIn - 2 * Int(varDecimalIn/2)) & "|" & DecToBin 
      lngCounter = lngCounter + 1 
     End If 
     varDecimalIn = Int(varDecimalIn/2) 
    Loop 
End Function 
+0

इस समाधान एक पाश – jsotola

1

मुझे लगता है कि आप शायद सब कुछ आप अन्य उत्तर से ऊपर की जरूरत मिल गया है, लेकिन अगर आप एक साधारण समारोह है कि दशमलव लेता है और सरणी देता है ..

Function dec_to_binary_array(decNum As Integer) 
    Dim arr() As String, NumAsString As String 
    NumAsString = Application.Dec2Bin(decNum) 
    arr = Split(StrConv(NumAsString, vbUnicode), vbNullChar) 
    ReDim Preserve arr(UBound(arr) - 1) 
    dec_to_binary_array = arr 
End Function 
संबंधित मुद्दे