web-dev-qa-db-ja.com

Excelでの大きな数値の10進数から2進数への変換

私はExcelシートにいくつかの大きな数字があり、それらをバイナリに変換したいと思います。例えば、12345678 965321458 -12457896ありがとう。

17
user3103991

_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)桁です。超過すると、最上位の15桁のみが残り、残りは丸められます。つまり_12345678901234567_と入力すると、Excelは_12345678901234500_として保存します。したがって、_2^48-1_は15桁の10進数であるため、数値は丸められません。

49
Taosique

投稿された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
7
JustinJDavies

上記の式を試したところ、MicrosoftがDEC2BIN関数を別の方法で台無しにして、負の数で式が正しく機能しないようにしました。内部的に、DEC2BINは10ビットの結果を使用します。オプションの長さパラメーターを使用しない限り、テキスト結果から先行ゼロが削除されます。この場合、必要な数の先行ゼロが文字列に残ります。しかし、ここで問題があります:負の数は常に1で始まるため、ドロップする先行ゼロがないため、DEC2BINは常に10ビットすべてを表示します!したがって、11111111(8個)を表示するDEC2BIN(-1,8)は、代わりに1111111111(10個)を表示します。

これを修正するには、RIGHTを使用して、各8ビットチャンクを8ビットにトリミングします。

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

(私はVBAを読み通しており、同じ問題はありませんが、ネガをまったく処理しないようです。)

5
Joe Avins

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
2
Nate

ここでは、バイナリシフト操作がより明確で関連性の高いものであることがわかります。

=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ビット値用です

1
Geom

おそらくもっと簡単なオプション:

正数のみの場合、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式に結合できます。以下に、同じ答えを与える2つの方法を示します。ここで、MyNumは最初の10進数です。

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

または

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

このvba関数は、WorksheetFunction.dec2binでは実行できない511を超える数値のバイナリ変換の問題を解決します。
このコードは、WorksheetFunction.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
1
Diego

私はこれを負数や小数用に書いていませんが、比較的簡単に修正できるはずです。この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
0
jbs3141

別の方法があります。単一の式ではありませんが、最大2,099,999,999,999の数値に変換してみました。私の最初の意図は51ビットカウンターを構築することでしたが、どういうわけか、私が言及した数を超える数では機能しません。ダウンロード http://www.excelexperto.com/content/macros-production/contador-binario-de-51-bits/

役に立つことを願っています。よろしく。

0
Víctor Urbina