source

Excel의 큰 숫자에 대한 10진수에서 2진수로 변환

factcode 2023. 4. 14. 22:11
반응형

Excel의 큰 숫자에 대한 10진수에서 2진수로 변환

엑셀 시트에 큰 숫자가 있어서 바이너리로 변환하고 싶습니다.

예.

12345678  
965321458  
-12457896

만약 우리가 양수를 말한다면0 ★★★★★★★★★★★★★★★★★」2^32-1하다

=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)

=DEC2BIN()함수는 511보다 큰 숫자를 처리할 수 없기 때문에 내 공식에서 볼 수 있듯이 숫자를 4개의 8비트 청크로 나누고 이진 형식으로 변환한 다음 결과를 연결합니다.

이론적으로는 이 식을 최대 6개의 8비트 청크로 확장할 수 있습니다.Excel에서 얻을 수 있는 최대 정밀도는 소수점 15자리입니다.으로 입력해 주세요. , 15번이라고 치면 .12345678901234567은 Excel로 합니다.12345678901234500★★★★★★★★★★★★★★★★.2^48-1소수점 이하 15자리일 경우 반올림되지 않습니다.

보다 심플한 옵션:

양수일 경우에만 Excel의 0 ~2^53 의 숫자에 BASE(BASE2 와 같이)를 사용합니다.다음은 몇 가지 예입니다.

=BASE(3,2)  # returns 11

=BASE(11,2)  # returns 1011

답변에 대한 크레딧은 https://ask.libreoffice.org/en/question/69797/why-is-dec2bin-limited-to-82bits-in-an-32-and-64-bits-world/에서 확인할 수 있습니다.

음수: 생각해 보니, 음수 역시 howy61의 답변을 바탕으로 처리될 수 있다.2의 보수를 사용하기 위해 모든 것을 2의 거듭제곱(자신의 경우 2^31)으로 이동합니다.

=BASE(2^31+MyNum, 2)

따라서 (8비트에 대해서만 2^8 사용):

=BASE(2^8+(-1),2)  # returns 11111111 

=BASE(2^8+(-3),2)  # returns 11111101

OP에 의해 주어진 수치에는 더 많은 비트가 필요하기 때문에 2^31(2^53까지 가능)을 사용합니다.

=BASE(2^31+(-12457896),2)  # returns 11111111010000011110100001011000

양수 또는 음수의 경우 두 공식 모두 하나의 IF 공식으로 결합할 수 있습니다.다음은 동일한 답변을 제공하는 두 가지 방법입니다. MyNum은 시작하는 10진수입니다.

=IF(MyNum<0, BASE(2^31+MyNum,2), BASE(MyNum, 2))

또는

=BASE(IF(MyNum<0, MyNum+2^32, MyNum), 2)

여기에 게시된 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

위의 공식을 사용해 보니 마이크로소프트가 DEC2를 망쳤다.BIN은 음수에서는 공식이 올바르게 동작하지 않도록 하는 다른 방법으로 기능합니다.내부, DEC2BIN은 10비트 결과를 사용합니다.옵션의 길이 파라미터를 사용하지 않는 한 선두 제로는 텍스트 결과에서 드롭됩니다.이 경우 선두 제로는 필요한 개수의 선두 제로가 문자열에 남습니다.하지만 여기서 문제가 있습니다. 음수는 항상 1로 시작되므로 선행 0이 드롭되지 않습니다.따라서 DEC2BIN은 항상 10비트를 모두 표시합니다.따라서 DEC2BIN(-1,8)에는 111111(8개)이 표시되며 대신 11111111(10개)이 표시됩니다.

이 문제를 해결하려면 RIGHT를 사용하여 각 8비트 청크를 8비트로 트리밍합니다.이렇게 말하면 바보같습니다.

=RIGHT(DEC2BIN(QUOTIENT(A1,256^3),8),8) & RIGHT(...

(VBA를 통해 읽었는데, 같은 문제는 없지만 네거티브는 전혀 처리할 수 없을 것 같습니다.)

Taosique의 훌륭한 답변에 읽기 쉬운 포맷을 추가하기 위해 4비트로 분할하여 공백으로 만들 수도 있습니다.단, 공식은 괴물이 됩니다.

=DEC2BIN(MOD(QUOTIENT($A$1,16^7),16),4)&" "&DEC2BIN(MOD(QUOTIENT($A$1,16^6),16),4)&" "&DEC2BIN(MOD(QUOTIENT($A$1,16^5),16),4)&" "&DEC2BIN(MOD(QUOTIENT($A$1,16^4),16),4)&" "&DEC2BIN(MOD(QUOTIENT($A$1,16^3),16),4)&" "&DEC2BIN(MOD(QUOTIENT($A$1,16^2),16),4)&" "&DEC2BIN(MOD(QUOTIENT($A$1,16^1),16),4)&" "&DEC2BIN(MOD(QUOTIENT($A$1,16^0),16),4)

1101 0100 1111 0110 0011 0001 0000 0001

물론 16비트 숫자만 알고 싶다면 오른쪽 절반만 사용할 수 있습니다.

=DEC2BIN(MOD(QUOTIENT($A$1,16^3),16),4)&" "&DEC2BIN(MOD(QUOTIENT($A$1,16^2),16),4)&" "&DEC2BIN(MOD(QUOTIENT($A$1,16^1),16),4)&" "&DEC2BIN(MOD(QUOTIENT($A$1,16^0),16),4)

0011 0001 0000 0001

음수나 소수점 때문에 쓴 것은 아니지만, 비교적 쉽게 수정할 수 있을 것입니다.이 VBA는 최대 32767자리(VBA의 최대 문자열 길이)를 포함하는 변환된 바이너리 결과까지 슈퍼 라지(또는 그렇게 크지는 않지만, 그것이 요점이 아닙니다)를 변환합니다.

셀 "A1"에 문자열로 10진수를 입력하면 결과는 문자열로 "B1"이 됩니다.

Dim NBN As String

Dim Bin As String

5 Big = Range("A1")

AA = Len(Big)

For XX = 1 To AA

L1 = Mid(Big, XX, 1) + CRY

CRY = 0

If L1 = 0 Then

FN = "0"

GoTo 10

End If

If Int(L1 / 2) = L1 / 2 Then

FN = L1 / 2

GoTo 10

End If

If Int(L1 / 2) <> L1 / 2 Then

FN = Int(L1 / 2)

CRY = 10

GoTo 10

End If

10 NBN = NBN & FN

Next XX

If Left(NBN, 1) = "0" Then

NBN = Right(NBN, (Len(NBN) - 1))

End If

If CRY = 10 Then Bin = "1" & Bin Else Bin = "0" & Bin

Range("A1") = NBN

Range("A2") = Bin

If Len(NBN) > 0 Then

NBN = ""

CRY = 0

GoTo 5

End If

여기서 바이너리 시프트 연산이 보다 명확하고 적절하다는 것을 알 수 있습니다.

=DEC2BIN(BITRSHIFT($A$1,24),8) & DEC2BIN(MOD(BITRSHIFT($A$1,16),256),8) & DEC2BIN(MOD(BITRSHIFT($A$1,8),256),8) & DEC2BIN(MOD($A$1,256),8)

이 공식은 32비트 값입니다.

vba Worksheet Function . dec2bin 로 、 511 보1111 。
Worksheet Function.dec2bin을 선택합니다.

Function decimal2binary(ByVal decimal2convert As Long) As String
Dim rest As Long
If decimal2convert = 0 Then
   decimal2binary = "0"
   Exit Function
End If
Do While decimal2convert > 0
   rest = decimal2convert Mod 512
   decimal2binary = Right("000000000" + WorksheetFunction.Dec2Bin(rest), 9) + decimal2binary
   decimal2convert = (decimal2convert - rest) / 512
Loop
decimal2binary = Abs(decimal2binary)
End Function
=IF(Decimal>-1,BASE(Decimal,2,32),BASE(2^32+(Decimal),2))

양수와 음수를 모두 사용합니다.좀 웃었어.기술 말장난.천만에요.

다른 방법이 있어요.하나의 공식은 아니지만, 저는 2,099,999,999라는 숫자로 변환하려고 했습니다.처음에는 51비트 카운터를 구축하려고 했는데, 왜 그런지 아까 말한 수치 이외의 수치에서는 동작하지 않습니다.http://www.excelexperto.com/content/macros-production/contador-binario-de-51-bits/에서 다운로드

유용했으면 좋겠어요.안부 전해요.

그러나 VBA를 사용하지 않고 음수(여기서는 sint16)로도 작업할 경우 공간을 더 많이 차지합니다.

"int16 bits to decimal.xlsx" 엑셀시트 스크린샷

여기서 엑셀 파일을 다운로드할 수 있습니다. (죄송합니다.파일을 어디에 둘지 몰랐습니다) int16 bits에서 10진수까지 다운로드 할 수 있습니다.xlsx

또는 다음 절차를 수행합니다(Excel이 영어로 되어 있지 않은 경우 Excel 번역기를 사용하여 MS Office 언어로 수식을 '번역'합니다).

  1. 스크린샷에 표시된 것처럼 4비트 니블(A4 = D4 = 최하위)로 이진수를 입력합니다.4자리 모두 입력(0부터 시작해도)하여 "텍스트" 형식으로 지정합니다.
  2. F4에 공식 입력:
    =IF(NUMBERVALUE(A4)>=1000,TRUE,FALSE)
  1. G2-J2에서 "A", K2-N2에서 "B", O2-R2에서 "C", S2-V2에서 "D"를 입력합니다.

  2. G3, K3, O3, S3에 '1', H3, L3, P3 및 T3에 '2', I3, M3, Q3 및 U3에 '3', J3, N3, R3 및 V3에 '4'를 입력합니다.

  3. G4에 다음과 같이 입력합니다.

    =MID(INDIRECT(G$2&ROW()),G$3,1)
  1. 수식을 H4-V4에 복사

  2. X4에 다음과 같이 입력합니다.

    =IF(G4="1",0,1)
  1. X4를 Y4-AM4에 복사

  2. BD3에 "1"을 입력합니다.

  3. BC4에 다음과 같이 입력합니다.

    =IF((AM$4+BD3)=2,1,0)
  1. BD4에 다음과 같이 입력합니다.
    =IF((AM$4+BD3)=2,0,IF((AM$4+BD3)=1,1,0))
  1. BD4와 BD4를 복사하여 대각선 방향으로 한 줄 더 아래쪽으로 한 줄 더 왼쪽으로 한 열 더 삽입하십시오. 즉, BB5와 BC5에 삽입한 다음 BA6와 BB6, ..., AN19와 AO19를 삽입하십시오.

  2. AO20에 "=AO19"를 입력하고 AP20에 "=AP18"을 입력한 후 BD20("=BD4")까지 계속 입력합니다. 즉, 스크린샷에 표시된 대로 숫자를 한 줄로 표시합니다.

  3. BE20 에 다음과 같이 입력합니다(이것은 결과입니다).

    =IF(F4=FALSE,BIN2DEC(A4&B4)*2^8+BIN2DEC(C4&D4),-1*(BIN2DEC(AO20&AP20&AQ20&AR20&AS20&AT20&AU20&AV20)*2^8+BIN2DEC(AW20&AX20&AY20&AZ20&BA20&BB20&BC20&BD20)))

간단한 해결책이 있을지도 몰라실제로 음의 Two's Complete인 42억 개의 셀이 몇 개 있고, 이것은 올바른 값을 얻기 위해 작동합니다: =SUM(2^31-(A1-2^31)

언급URL : https://stackoverflow.com/questions/24387894/decimal-to-binary-conversion-for-large-numbers-in-excel

반응형