tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトル32ビット正数を扱う
記事No14975
投稿日: 2010/10/17(Sun) 13:54
投稿者あつ
32ビット正数(0〜4294967295)を2進数表記するソフトを作成。
longだと符号付4バイトなので正数は31ビットまでしか扱えません。
double符号付8バイトなので変更したところ、MOD関数が処理できないようです。
プログラムを実行させるにはどのようにすればよいでしょうか。

    Dim ltmp As Long
'   Dim ltmp As Double
    Dim iloop As Integer
    
    ltmp = Text1.Text
    Text2.Text = "" 'クリア
    For iloop = 1 To 32
        Text2.Text = Text2.Text & (ltmp Mod 2)
        If ltmp Mod 2 Then ltmp = ltmp - 1
        ltmp = ltmp / 2
        '4ビット毎にスペース追加
        If (iloop Mod 4) = 0 Then Text2.Text = Text2.Text & " "
    Next iloop

[ツリー表示へ]
タイトルRe: 32ビット正数を扱う
記事No14976
投稿日: 2010/10/17(Sun) 21:52
投稿者ミッキー
Mod演算子(Mod 関数ではありません)について、
マイクロソフトのサポート情報によると、
Mod 演算子は整数演算のため、演算前に自動的に
整数に変換されるとのことです。

http://support.microsoft.com/kb/q205053/

上記の日本語サイトは、英語版を自動翻訳しているため
翻訳がおかしな部分がありますので、英語版(下のリンク)を
読まれた方がいいです。

http://support.microsoft.com/kb/205053/en-us/

ですので・・・

> double符号付8バイトなので変更したところ、
> MOD関数が処理できないようです。

Double型だから処理できないのではなく、
Long型に変換したときにオーバーフローするから処理できないのです。
Double型でも Long 型に収まる範囲の値であれば処理できます。

あと、
> 32ビット正数(0〜4294967295)を2進数表記するソフトを作成。

とありますが、投稿されたプログラムをはしらせると、
2進数表記を逆にした数値になると思いますが、これは正しいのですか?

たとえば、10進数「123」を2進数にしたときの値をA、
このロジックを使って計算した結果をBとすると、32桁で表記すると

A 0000 0000 0000 0000 0000 0000 0111 1011
B 1101 1110 0000 0000 0000 0000 0000 0000

となりますが、これはこれで正しいのですか?

> プログラムを実行させるにはどのようにすればよいでしょうか。

1つの手法として参考にしてください。

ltmp を Double型として、Itmp に代入された値が (2^31 - 1) より大きいかチェック

◆ 大きい場合
(2 ^ 31 - 1) を引いた値を2進数にする。
得られた2進数を文字列として扱って、
計算後に先頭1桁の「0」を「1」に置き換える。

◆ 小さい場合
そのまま計算を進めて、答えを得る。


プログラム自体は敢えて書きません。
簡単ですので、ご自身で考えてみてください。
考えることはスキルアップするためには大事ですので。

[ツリー表示へ]
タイトルRe^2: 32ビット正数を扱う
記事No14977
投稿日: 2010/10/18(Mon) 00:08
投稿者あつ
ミッキー様

> たとえば、10進数「123」を2進数にしたときの値をA、
> このロジックを使って計算した結果をBとすると、32桁で表記すると
>
> A 0000 0000 0000 0000 0000 0000 0111 1011
> B 1101 1110 0000 0000 0000 0000 0000 0000
> となりますが、これはこれで正しいのですか?
ご指摘ありがとうございました。改修します

> ltmp を Double型として、Itmp に代入された値が (2^31 - 1) より大きいかチェック

参考に作成します。ありがとうございました

[ツリー表示へ]
タイトルRe^3: 32ビット正数を扱う
記事No14980
投稿日: 2010/10/18(Mon) 23:25
投稿者ミッキー
すみません。自分の書き込みで間違いありました。

> ltmp を Double型として、Itmp に代入された値が (2^31 - 1) より
> 大きいかチェック

> ◆ 大きい場合
> (2 ^ 31 - 1) を引いた値を2進数にする。
> 得られた2進数を文字列として扱って、
> 計算後に先頭1桁の「0」を「1」に置き換える。

2^31 - 1 引いて得られた値から、更に1を引いてください。
最終的には 2 ^ 32 を引けばいいのですが、オーバーフロー
するかもしれませんので、いきなり 2 ^ 32 で引かないでください。

[ツリー表示へ]