programing

큰 숫자와 함께 DEC2BIN() 사용

topblog 2023. 6. 7. 22:06
반응형

큰 숫자와 함께 DEC2BIN() 사용

변환하려고 합니다.4503599627370495Excel에서 이진으로 변환합니다. DEC2BIN()은 DEC2BIN이 이렇게 큰 숫자를 처리할 수 없기 때문에 #Num! 오류를 반환합니다.

어떻게 하면 잘 될 수 있을까요?

이것은 매우 간단합니다. 베이스(...) 기능이 도움이 됩니다.

BASE(CELL, 2)

두 번째 매개변수 2는 이진수에 대한 것으로, Hex, Oct로 다른 관련 기저로 변환할 수 있습니다.

Thansx Justin Davies - 그것이 바로 내가 필요로 했던 것이었지만, 만약 -ve 숫자를 넘기면 그것은 끝없는 순환에 들어갔습니다.내 수정사항:

Function DecToBin(ByVal DecimalIn As Variant, Optional NumberOfBits As Variant) As String
  DecToBin = ""
  DecimalIn = CDec(DecimalIn)
  If DecimalIn < 0 Then
    DecToBin = "Error - Number negative"
    Exit Function
  End If
  Do While DecimalIn <> 0
    DecToBin = Trim$(Str$(DecimalIn - 2 * Int(DecimalIn / 2))) & DecToBin
    DecimalIn = Int(DecimalIn / 2)
  Loop
  If Not IsMissing(NumberOfBits) Then
    If Len(DecToBin) > NumberOfBits Then
      DecToBin = "Error - Number too large for bit size"
    Else
      DecToBin = Right$(String$(NumberOfBits, "0") & _
      DecToBin, NumberOfBits)
    End If
  End If
End Function

여기에 게시된 VBA 참조

' The DecimalIn argument is limited to 79228162514264337593543950245
' (approximately 96-bits) - large numerical values must be entered
' as a String value to prevent conversion to scientific notation. Then
' optional NumberOfBits allows you to zero-fill the front of smaller
' values in order to return values up to a desired bit level.
Function DecToBin(ByVal DecimalIn As Variant, Optional NumberOfBits As Variant) As String
  DecToBin = ""
  DecimalIn = CDec(DecimalIn)
  Do While DecimalIn <> 0
    DecToBin = Trim$(Str$(DecimalIn - 2 * Int(DecimalIn / 2))) & DecToBin
    DecimalIn = Int(DecimalIn / 2)
  Loop
  If Not IsMissing(NumberOfBits) Then
    If Len(DecToBin) > NumberOfBits Then
      DecToBin = "Error - Number too large for bit size"
    Else
      DecToBin = Right$(String$(NumberOfBits, "0") & _
      DecToBin, NumberOfBits)
    End If
  End If
End Function
=DEC2BIN(MOD(QUOTIENT($A$1,256^3),256),8)&DEC2BIN(MOD(QUOTIENT($A$1,256^2),256),8)&DEC2BIN(MOD(QUOTIENT($A$1,256^1),256),8)&DEC2BIN(MOD(QUOTIENT($A$1,256^0),256),8)

Excel에서 큰 숫자에 대한 중복 십진법에서 이진법으로의 변환에 응답한 Taosique의 제공.

MS가 또 실패했기 때문에 엑셀 십진 정수를 이진수로 변환하는 VBA 기능이 필요했습니다.저는 다음과 같이 생각해 냈지만, 저는 1과 0의 문자열을 출력으로 받아들여야 했습니다. 저는 괜찮았습니다.고유할 수도 있고 그렇지 않을 수도 있는 로그 기준 2를 사용하며 모든 양의 정수에 대해 그대로 작동합니다.

Function Dec_Bin(dx As Integer) As String
    Dim x As Integer
    Dim y As Long
    Dim z As Integer
    Dim zz As Double
    Dim ch As String
    Dim str As String, s1 As String
    Dim lead As Boolean

    ch = String(15, "0")
'    Stop
    zz = Log(dx) / Log(2)
    z = Fix(zz)
    y = dx - 2 ^ z
    z = 15 - z
    Mid(ch, z, 1) = "1"
    While y > 0
        zz = Log(y) / Log(2)
        z = Fix(zz)
        y = y - 2 ^ z
        z = 15 - z
        Mid(ch, z, 1) = "1"
        Wend

    ch = ch & "B"
    Dec_Bin = ch
End Function

이 기능은 더블이 가질 수 있는 만큼 크게 변환됩니다.하지만 저는 부정적인 가치를 가지고 시도하지 않았습니다.

Function cn(ByVal n As Double, ByVal s As Double)
  'n the number to convert
  's the numberic system to convert to.
  'This function can convert to binary all the way to the length of the
  'digits string and all in between.

  Dim x As Double  'The exponent without decimals
  Dim xx As Double 'The exponent with decimals, if any
  Dim r As String  'The return string
  Dim p As Integer 'Posistion of the digit in the return string
  Dim L As Long    'Length of the string return string
  Dim d            '(d+1) because mid() does not accept 0.
                   'The position of the digit in the digits string.
 Dim v As Double   'The numeric value of the position 
                   'of the digit in the return string
  Dim digits As String
  digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Start:

  If n > 0 Then
     xx = Log(n) / Log(s)
     x = Int(xx)
  End If
  p = x + 1
  If r = "" Then
    r = String(p, "0")
    L = p
  End If
  v = s ^ x
  d = n \ v
  Mid(r, L - x, 1) = Mid(digits, d + 1, 1)
  n = n - (v * d)
  If n <> 0 Then GoTo Start
  cn = r
End Function

일반적으로 십진수 값의 이진수를 알아야 할 때 16진수 값을 보는 것은 항상 흥미롭습니다.Microsoft가 큰 숫자를 제한했기 때문에 이 함수는 큰 숫자에 대해 MOD나 HEX()를 사용하지 않으므로 매우 큰 숫자에 대해 수동으로 수행됩니다.

Bino(값, 바이트)

값은 소수점 이하의 정수이거나 셀이 포함된 작은 숫자 또는 초대형 숫자일 수 있습니다.바이트는 선택 사항, 표준 2, 자동입니다.

= 비노(A1,4)

표시되는 바이트 및 비트 수는 최소 2바이트의 표준 값을 기준으로 자동으로 지정되지만 옵션인 bytes 인수를 사용하여 왼쪽에 추가 0바이트로 패딩할 수 있습니다.위의 예에서는 A1에 숫자가 하나 포함되어 있더라도 4바이트 및 32비트가 포함된 A1이 표시되며, 4보다 크면 더 많은 바이트 및 비트가 사용됩니다.

=비노(A1)

최소 2바이트 및 16비트 또는 필요한 경우 더 큰 A1이 표시됩니다.더 나은 시각화를 위해 이진 형식은 니블을 "-"로, 바이트를 "|"로 구분합니다.

=Bino(129) = 0x0081 = 0000-0000|1000-0001

=비노(129,1) = 0x81 = 1000-0001

=비노(257,1) = 0x0101 = 0000-0001|0000-0001

이 기능은 숫자가 음수이거나 바이트 수가 10보다 클 경우 CELL에 오류 메시지를 삽입하도록 조작됩니다.쉽게 제거하거나 변경할 수 있습니다.

VBA가 8비트 마이크로컨트롤러(AVR) 어셈블리의 최적화 코드를 위해 많은 수학을 시뮬레이션하고 16비트 정밀도로 Sin(x)과 Ln(x)의 루틴을 만드는 동안 도움이 되었습니다.

Public Function Bino(ByVal Valo As Double, Optional ByVal Bytes As Long = 2) As String
Dim Conta
Dim Resul as String
Dim Bits
Dim SA As Double
Dim SB As Double
Dim SX As String

If Valo < 0 Then
   Bino = "[Err: Negative]"
   Exit Function
   End If

If Bytes > 4 Then
   Bino = "[Err: Bytes > 10]"
   Exit Function
   End If

ValoHex = ""
SB = Valo
Do While SB > 1
   SA = SB / 16
   ValoHex = Hex(Int(16 * (SA - Int(SA)))) & ValoHex
   SB = SA
Loop

If Len(ValoHex) Mod 2 = 1 Then ValoHex = "0" & ValoHex
Zeroz = Bytes * 2 - Len(ValoHex)
If Zeroz = 2 Then ValoHex = "00" & ValoHex
If Zeroz = 4 Then ValoHex = "0000" & ValoHex
ValoHexLen = Len(ValoHex)
ValoHex = "0x" & ValoHex

If Bytes < ValoHexLen Then Bytes = ValoHexLen / 2
Bits = Bytes * 8 - 1
For Conta = 0 To Bits
    Div = ""
    If Conta And Conta Mod 4 = 0 Then Div = "-"
    If Conta And Conta Mod 8 = 0 Then Div = "|"
    If Int(Valo / 2) = Valo / 2 Then Bitt = 0 Else Bitt = 1
    Resul = Bitt & Div & Resul
    Valo = Int(Valo / 2)
Next Conta

Resul = ValoHex & " = " & Resul
Bino = Resul

End Function

나는 음수를 처리하고 이진수를 2의 보형 형식으로 반환하기 위해 AndruWitta의 수정 사항을 조금 수정했습니다.

Function DecToBin(ByVal DecimalIn As Variant, Optional NumberOfBits As Variant) As String
  DecToBin = ""
  DecimalIn = CDec(DecimalIn)
  If DecimalIn < 0 Then
  DecimalIn = -DecimalIn - 1

     Do While DecimalIn <> 0
        DecToBin = Trim$(Str$(Not DecimalIn - 2 * (Int(DecimalIn / 2 + 1)))) & DecToBin
        DecimalIn = Int(DecimalIn / 2)
    Loop
    DecToBin = Trim$(Str$(1)) & DecToBin
  Else
    Do While DecimalIn <> 0
        DecToBin = Trim$(Str$(DecimalIn - 2 * Int(DecimalIn / 2))) & DecToBin
        DecimalIn = Int(DecimalIn / 2)
    Loop
  End If
  If Not IsMissing(NumberOfBits) Then
    If Len(DecToBin) > NumberOfBits Then
      DecToBin = "Error - Number too large for bit size"
    Else
      DecToBin = Right$(String$(NumberOfBits, "0") & _
      DecToBin, NumberOfBits)
    End If
  End If
End Function

VBA 없이 양 및 음의 16비트 숫자(sint16)를 처리할 수 있는 Excel 파일이 있습니다. 여기에서 제 답변을 참조하십시오. https://stackoverflow.com/a/64261306/2738240

언급URL : https://stackoverflow.com/questions/22109116/using-dec2bin-with-large-numbers

반응형