私はExcelシートにいくつかの大きな数字があり、それらをバイナリに変換したいと思います。例えば、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)桁です。超過すると、最上位の15桁のみが残り、残りは丸められます。つまり_12345678901234567
_と入力すると、Excelは_12345678901234500
_として保存します。したがって、_2^48-1
_は15桁の10進数であるため、数値は丸められません。
投稿された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
上記の式を試したところ、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を読み通しており、同じ問題はありませんが、ネガをまったく処理しないようです。)
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
ここでは、バイナリシフト操作がより明確で関連性の高いものであることがわかります。
=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ビット値用です
おそらくもっと簡単なオプション:
正数のみの場合、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)
この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
私はこれを負数や小数用に書いていませんが、比較的簡単に修正できるはずです。この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
別の方法があります。単一の式ではありませんが、最大2,099,999,999,999の数値に変換してみました。私の最初の意図は51ビットカウンターを構築することでしたが、どういうわけか、私が言及した数を超える数では機能しません。ダウンロード http://www.excelexperto.com/content/macros-production/contador-binario-de-51-bits/
役に立つことを願っています。よろしく。