10進数から2進数への効率の良い変換方法??
自分が思いつくのは・・・
・10進数を16進数に変換
・LEN()で桁の数を取得して変数Cに格納
・FOR NEXTで1からCまでのカウント
ループ処理の中でカウンタの数の桁を取得
case1 で0001
case2 で0010
case3 で0011
・
・
・
caseE で1110
caseF で1111
という感じで16進数の全ての桁を調べていき最後に全てを
結合したら2進数になるはずです・・・きっと^^
しかしこれでは効率が悪すぎるような気がしてならないのですが・・・
良い方法はありませんか?
ビット演算すれば楽だと思います。
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ビット目が立っています。
(以下省略)
という風に見ていきます。
これならループで回せるから数行で出来ます。
あ、ちなみにlngDataってのはLong型の数値(変換したい10進数)が入ってる変数ってことで(^^;
ご返信ありがとうございます^^
詳しく教えていただけないでしょうか>nanashiさん
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配列に入れて、
自前で繰り下がり計算することになります。
(アセンブラだと右シフトしていくだけなんですけどね。)
あんだけ説明すれば分かると思ったんですが……。
ビット演算に関しては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
ありがとうございます>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進数に変換する関数作れよと嘆いてみたり^^
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
こんなんできました。そっくりそのまま使うのはあれなんで^^
改良。改良!!悪くなってるのは確かかも・・・
実際、自分べき乗の『2^0』が0を返すとは知らなくて・・・
2倍で良いや!!みたいな。。。
改めて『nanashi』さん『say』さんありがとうございました。^^
って変数cが先にオーバーフローするじゃん(・w・)
「2 ^ 0」は1ですよー。
あとcはLong型とかDouble型にすれば先にオーバーフローしなくなると思います。
10進数の負の値を2進数で表したいのですが、VBには反転が無いのですね。
結構悩んだのですが解らないので、よければ教えて頂けませんかm(__)m
2進数における負数表現に付いては、理解済みですよね?
> 10進数の負の値を2進数で表したいのですが、VBには反転が無いのですね。
この場合の『反転』とは、何を意味していますか?
符号反転であれば、-1を乗じればOKですね。
ビット反転の意味であれば、Not演算子です。
一部のビットだけを反転させるなら、Xor演算子で。
すみません、説明不足でした。ビット反転の事です。
さっそくNot演算子を使って試してみます。
『魔界の仮面弁士』さんありがとうございましたm(__)m
ツイート | ![]() |