- ベストアンサー
10進数を2進数に変換する方法とは?
- 業務上のログ解析において、10進数を2進数に変換する必要が生じましたが、変換方法がわかりません。
- ExcelのDEC2BIN関数では、与件(10進数)が512を超えるとエラーが発生するため、他の方法を探しています。
- VBAの使い方がわからないため、Excelの関数や他の方法を利用して一括でログを加工したいと考えています。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
#3のものです。こんにちは DEC2BIN関数をつかって#NAME?と出た場合は... 1. メニューの [ツール(T)] - [アドイン(I)...] をクリックします。 2. アドインの一覧の中の [分析ツール]の項目にチェックをいれ、[OK] をクリックします。 ご質問の 512^2 の件ですが... 表記のとおり、入力してよいです。 もし書き直す場合は(512*512) というように全体を()でくくっていただけますか。演算子の優先順位がかわってくる可能性がありますので... たとえば 6000/512^2 という式を書き換えるのでしたら 6000/512*512 × 6000/(512*512) ○ ということです。
その他の回答 (6)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
すみません。 #6で 「逆並びになる」は勘違いでした。 すみません。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#2です。 マクロの作り方 #4でimogasiさんが書いていてくれている通りで とりあえず、使い方は、ともかく、張り付け成功すれば、 関数として、シート上で使えるようになります。 わからなければ、また訊いて下さい。 ちなみに、 #4のプログラムでは、 逆並びになるし、MODで10進10桁の処理ができません。
- imogasi
- ベストアンサー率27% (4737/17069)
簡単にならないかやってみました。 A列に10進数が入っていて、B列に1か0の文字列を 出しています。B列を書式-セル-配置-右詰めにして,また列幅を広げてください。 Sub test01() d = Range("A65536").End(xlUp).Row For i = 1 To d b = "" s = Cells(i, "A") While Not (s <= 1) b = (s Mod 2) & b s = Int(s / 2) Wend b = (s Mod 2) & b Cells(i, "B") = "'" & b Next i End Sub >マクロの作成方法自体、エクセルのヘルプを見たのですがよくわからないです・・・。 シートの画面でツール-マクロ-VBEでVBEの画面になる。 その画面のメニューで挿入-標準モジュールをクリックで白紙の画面がでるから、そこへ上記をコピーし貼りつける。そしてメニューの実行-SUB・ユーザーフォームの実行をクリックで実行されるので、シートに戻る。 関数化するなら Function d2bin(a) b = "" s = a '--- While Not (s <= 1) b = (s Mod 2) & b s = Int(s / 2) Wend '--- b = (s Mod 2) & b d2bin = b End Function と上記標準モジュールにいれておいて シートでB1セルに=D2BIN(A1)のようにいれる。B2以下は式の複写が出きる。
- moon_piyo
- ベストアンサー率60% (88/146)
DEC2BINという関数の存在はここをみてはじめて知りました。ありがとうございます。 さてこの関数の与件は511までなので、もとの数を512進数に変換しそれぞれの桁の値(0~511)をDEC2BINで変換し、最後にくっつけてみました。 512^4-1 の値まで対応できます 与件がA1に入っているとして =DEC2BIN(INT(INT(A1/512^2)/512),9)&DEC2BIN(MOD(INT(A1/512^2),512),9)&DEC2BIN(INT((A1-INT(A1/512^2)*512^2)/512),9)&DEC2BIN(MOD((A1-INT(A1/512^2)*512^2),512),9) このままだと常に先頭に0がつきますね。上記の式がB1にあるとして =MID(B1,FIND("1",B1),LEN(B1)) などで0を取り除くとよいかと思います
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
すみません、ご希望には添えませんが、 やはり、VBAで関数を作りましょう。 VBEで挿入モジュールから以下を貼り付けて下さい。 Const table = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" Function str2dec(str As String, radix As Currency) As Currency Dim wk As Currency Dim i As Integer wk = 0 For i = 1 To Len(str) wk = wk * radix + InStr(table, UCase(Mid(str, i, 1))) - 1 Next str2dec = wk End Function Function dec2N(ByVal n As Currency, radix As Currency) As String Dim str As String str = "" Do While (n >= radix) str = str & Mid(table, modulas(n, radix) + 1, 1) n = Int(n / radix) Loop str = str + Mid(table, n + 1, 1) dec2N = reverse(str) End Function Function reverse(str As String) As String Dim revStr As String Dim i As Integer revStr = "" For i = Len(str) To 1 Step -1 revStr = revStr & Mid(str, i, 1) Next reverse = revStr End Function Function modulas(value As Currency, m As Currency) As Currency Dim wk As Currency wk = Int(value / m) modulas = value - wk * m End Function =dec2N(9999999999,2) で10進数を2進数に変換します。(数値の部分はもちろんセルで指定します) 逆に戻す時は =str2dec("1001010100000010111110001111111111",2) で戻せます。 基本的に、基数を指定して36進数まで使えます。
補足
すみません、マクロの作成方法自体、エクセルのヘルプを見たのですがよくわからないです・・・。 具体的にどう操作すれば「VBAで関数を作る」 「VBEで挿入モジュールから貼り付ける」ことができるかご教示いただけないでしょうか・・。
2進数は、与件の10進数を2で割っていって、商が0になるまでの 余りの並びの逆順になります。 例:10進数 11 を2進数に変換する手順 2) 11 (11を2で割って、商 5 余り 1。以下同じ手順) ~~~~~~ 2) 5 余りが 1 ~~~~~~ 2) 2 余りが 1 ~~~~~~ 2) 1 余りが 0 ~~~~~~ 0 余りが 1 となりますから、余りの並びを下から並べ直すと 答えは 01011 です。(先頭の0は最終の商です) これをExcelでVBAを使わず表現すると以下のようになりますかねえ... A列 B列 C列 ・・・・AZ列 1行 1234567891 =A1-B2*2 =B$2-C2*2 ・・・・・ 2行 =INT(A1/2) =INT(B$2/2) ・・・・・ 3行 4行 =AZ列 & ・・・・ & C列 & B列 1行目の数式は、Mod 関数を使いたいところですが、与件の10進数が 10桁まであるというお話ですので、桁あふれを恐れて上記の形に してみました。 また数式が AZ列まで必要とは思わないので、その辺は適宜調整ですね。 VBAを使えば、もっと、もっと、もっと...スッキリ実現しますので ぜひVBA習得に挑戦してみてくださいませませ。
補足
早速ためさせてもらいましたが、「#NAME?」という回答が帰ってきました。 質問ですが、「512^2」とはそのまま入力するのですか?512*512と書き直す必要があるのでしょうか?