10進数から2進数に変換する効率のいい方法

解決


godspeed  URL  2003-05-11 02:09:22  No: 107050

10進数から2進数への効率の良い変換方法??
自分が思いつくのは・・・
・10進数を16進数に変換
・LEN()で桁の数を取得して変数Cに格納
・FOR NEXTで1からCまでのカウント
        ループ処理の中でカウンタの数の桁を取得
        case1  で0001
        case2  で0010
        case3  で0011
          ・
          ・
          ・
        caseE  で1110
        caseF  で1111
という感じで16進数の全ての桁を調べていき最後に全てを
結合したら2進数になるはずです・・・きっと^^

しかしこれでは効率が悪すぎるような気がしてならないのですが・・・
良い方法はありませんか?


nanashi  2003-05-11 04:02:48  No: 107051

ビット演算すれば楽だと思います。

lngData And 1  が0じゃなければ1ビット目が立っています。
lngData And 2  が0じゃなければ2ビット目が立っています。
lngData And 4  が0じゃなければ3ビット目が立っています。
lngData And 8  が0じゃなければ4ビット目が立っています。
lngData And 16 が0じゃなければ5ビット目が立っています。
(以下省略)

という風に見ていきます。
これならループで回せるから数行で出来ます。


nanashi  2003-05-11 04:11:17  No: 107052

あ、ちなみにlngDataってのはLong型の数値(変換したい10進数)が入ってる変数ってことで(^^;


godspeed  2003-05-11 07:17:29  No: 107053

ご返信ありがとうございます^^
詳しく教えていただけないでしょうか>nanashiさん


Say  2003-05-11 10:48:02  No: 107054

VBユーザにはビット演算が苦手な人も少なくないので、
一番簡単なルールは、16進変換したりせず、すなおに
「2で割ったあまりを回答文字列の左に追加する」処理を
商が0になるまで繰り返す。でしょう。
21億以下の整数ならこれで大丈夫です。

Longの限界を超える整数の場合、一工夫いります。
下の例だと79228162514264337593543950330まで大丈夫です。
ちょっと変なことしてます。

Option Explicit

Private Sub Command1_Click()
    Dim buf1, buf2, buf3
    buf1 = Text1.Text
    buf2 = ""
    Do Until buf1 = "0"
        buf2 = Sgn(InStr(1, "13579", Right(buf1, 1))) & buf2
        buf3 = Split((CDec(buf1) / 2), ".")
        buf1 = buf3(0)
    Loop
    Text2.Text = buf2
    
End Sub

Private Sub Form_Load()
    Text1.Text = "79228162514264337593543950330"
    Text2.Text = ""
End Sub

これ以上の数だと、byte配列に入れて、
自前で繰り下がり計算することになります。
(アセンブラだと右シフトしていくだけなんですけどね。)


nanashi  2003-05-11 21:43:30  No: 107055

あんだけ説明すれば分かると思ったんですが……。
ビット演算に関してはMSDNを調べてください(確か載っていたはず…)。
知っていて損は無いと思います。

Long型で正の整数のみですが、以下のように出来ます。

Private Function Henkan(ByVal lngData As Long) As String
    Dim lngBit As Long
    Dim strData As String
    
    Do Until (lngData < 2 ^ lngBit)
        If (lngData And 2 ^ lngBit) <> 0 Then
            strData = "1" & strData
        Else
            strData = "0" & strData
        End If
        
        lngBit = lngBit + 1
    Loop
    
    Henkan = strData
End Function


godspeed  2003-05-12 10:14:27  No: 107056

ありがとうございます>sayさん
しかしよくわかりませんでした(X_X)
自分初めて間もないので・・・知らない関数の組み合わせが多すぎて、多分
最小限の記述なのだと思いますが。自分は一つ一つの関数が返した結果を変数にいちいち入れてそれを再度、関数や数字式に利用するという方法でしかいまいち理解できません・・・すみませんが私がスキルUPしたときに再度手ほどきお願いいたします。

すみません>nanashiさん
理論演算子Andは  a=bの時『a AND b = 1』『ture AND ture = ture』
のように同じものを比較したときに1又はtureを返すものだと思っていました。伴って2番目のスレの意味が理解できました^^
ちょっと疑問に思ったのですが、
  text1.text = henkan(10)
のときループ処理の二周目の条件分岐で
  10 and 2 <> 0 then
になりますがこのときVBが自動的に2進数の
  1010 and 0010
に変換して2ビット目を取り出して再度10進数に変換しているのでしょうか?
意味解りませんよねー^^要は10進数でビットと目的の数値を指定することが不思議でした。それなら初めから2進数に変換する関数作れよと嘆いてみたり^^


godspeed  2003-05-12 10:50:58  No: 107057

Private Function nisinsuu(ByVal data As Long) As String
Dim c As Integer                       '変数cの宣言(ビットの指定)
Dim data2 As String                    '変数data2の宣言(関数の返し値)
    c = 1                              '変数cの初期値の指定
        Do Until data < c
            If (data And c) <> 0 Then
                data2 = "1" & data2
            Else
                data2 = "0" & data2
            End If
        c = c * 2
        Loop
nisinsuu = data2
End Function


godspeed  2003-05-12 10:56:19  No: 107058

こんなんできました。そっくりそのまま使うのはあれなんで^^
改良。改良!!悪くなってるのは確かかも・・・
実際、自分べき乗の『2^0』が0を返すとは知らなくて・・・
2倍で良いや!!みたいな。。。

改めて『nanashi』さん『say』さんありがとうございました。^^


godspeed  2003-05-12 11:14:42  No: 107059

って変数cが先にオーバーフローするじゃん(・w・)


nanashi  2003-05-12 19:08:15  No: 107060

「2 ^ 0」は1ですよー。
あとcはLong型とかDouble型にすれば先にオーバーフローしなくなると思います。


tyu-bo-  2003-11-28 23:58:41  No: 107061

10進数の負の値を2進数で表したいのですが、VBには反転が無いのですね。
結構悩んだのですが解らないので、よければ教えて頂けませんかm(__)m


魔界の仮面弁士  2003-11-29 01:17:57  No: 107062

2進数における負数表現に付いては、理解済みですよね?

> 10進数の負の値を2進数で表したいのですが、VBには反転が無いのですね。
この場合の『反転』とは、何を意味していますか?

符号反転であれば、-1を乗じればOKですね。
ビット反転の意味であれば、Not演算子です。
一部のビットだけを反転させるなら、Xor演算子で。


tyu-bo-  2003-11-29 01:34:28  No: 107063

すみません、説明不足でした。ビット反転の事です。
さっそくNot演算子を使って試してみます。
『魔界の仮面弁士』さんありがとうございましたm(__)m


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加