10進数から2進数のビット変化について


VB初心者  2005-09-15 20:02:04  No: 125355

VB初心者です。

10進数で”1”の場合、2進数で”0000000000000001”
10進数で”2”の場合、2進数で”0000000000000010”
10進数で”3”の場合、2進数で”0000000000000011”

1から2になった場合、右から1ビット目が1→0
1から2になった場合、右から2ビット目が0→1
この場合、右から1ビット目、2ビット目が変化した
1から2に変化した場合、右から1ビット目、2ビット目が変化を取得

2から3になった場合、右から1ビット目が0→1
2から3になった場合、右から2ビット目が1→1
この場合、右から1ビット目が変化し、、2ビット目は変化していない
2から3に変化した場合、右から1ビット目が変化を取得

10進数で2進数のどのビットが変化したかを取得する方法があれば、ご教示お願いします。


ガッ  2005-09-15 20:09:40  No: 125356

ハミング距離…Xor演算?


いな  2005-09-15 20:30:21  No: 125357

ん〜まずは、10進を2進には変換できる?


VB初心者  2005-09-15 20:38:06  No: 125358

ガッさん、いなさん
早速のご返答ありがとうございます。

ガッさんへ

>ハミング距離…Xor演算?

調べてみたのですが、理解不能です。
申し訳ありません。もう少しご説明いただけると助かります。

いなさんへ

10進を2進には変換ですが、

Function DecToBin(ByVal x As Long) As String
    Dim a&
    a = 1
    
    Dim y&
    y = 0
    
    Dim i&
    For i = 0 To &H20 - 1
        If Mid(x, i + 1, 1) <> " " Then
            y = y Or a
        End If

        If i < &H20 - 1 - 1 Then
            a = a * 2
        Else
            a = &H80000000 'オーバフロー対策
        End If
    Next
    
    DecToBin = y
    
End Function


VB初心者  2005-09-15 21:00:16  No: 125359

前回のものは間違いでした。

10進を2進には変換ですが、

Function Dec2BinEx(Dec)
    Do
        Dec2BinEx = CStr(Dec Mod 2) & Dec2BinEx
        Dec = Dec \ 2
    Loop Until Dec = 0
End Function


KG  2005-09-15 22:01:57  No: 125360

XORが理解できないのであれば、
変更する前後で2進数の文字列を保存しておいて1文字ずつ比較する
方法でも、どこが変化したかは取得できるかと思います。

桁数はFormat関数でそろえるとしてですね。


通ってみた  2005-09-15 22:05:33  No: 125361

数値同士をXorしてみればわかる
ただそれだけではありませんか・・・


ひろ  2005-09-15 22:14:48  No: 125362

ビット演算のXorは仕様上

   元の値 Xor 比較対象 = (両者で一致しないビットだけ1になった値)

となりますので、比較したい値の型がByte,Integer,Longなら Xorを取ってから二進文字列にするだけでOKです。

何故そうなるかは排他的論理和の仕様をよく見ればわかります。

# 他にも指定ビットだけ反転とか、Xorを繰り返すことで1になっているビットの数が偶数か奇数かを判定するといった使い方があります。


我龍院忠太  2005-09-15 22:42:21  No: 125363

>Function Dec2BinEx(Dec)

Function Dec2BinEx(ByVal Dec)
の方が良いかな、何かと。

s = Format(Dec2BinEx(7 Xor 8), String(2 ^ 3, "0"))
こんなことして何が起こるか見てみるとか。


VB初心者  2005-09-16 02:43:25  No: 125364

KGさん 通ってみたさん ひろさん  我龍院忠太さん
早速のご返信を頂きまして誠にありがとうございました。

我龍院忠太さんのソースをもとにいろいろ試しています。

>s = Format(Dec2BinEx(7 Xor 8), String(2 ^ 3, "0"))

ひろさんへ
># 他にも指定ビットだけ反転とか、Xorを繰り返すことで1になっているビットの数が偶数か奇数かを判定するといった使い方があります。

甘えて申し訳ありませんが上記のサンプル等参考になるものがあれば教えていただけると助かります。


通ってみた  2005-09-16 03:52:56  No: 125365

2進数「01」と「11」を、Or、And、Xorしてそれぞれの結果を比較してみてください

それで理解できると思います


VB初心者  2005-09-16 19:01:41  No: 125366

通ってみたさん
ご返答ありがとうございました。

>2進数「01」と「11」を、Or、And、Xorしてそれぞれの結果を比較

ということでビット単位で調べてみたところ、理解できました。

AND 

両方とも1の場合だけ結果として1が返り、その他の場合は0になります。 

1 AND 1 = 1 
1 AND 0 = 0 
0 AND 1 = 0 
0 AND 0 = 0 

XOR 

両方のビットが異なる場合にだけ結果として1が返り、その他の場合は0になります。 

1 XOR 1 = 0 
1 XOR 0 = 1 
0 XOR 1 = 1 
0 XOR 0 = 0 

OR 

少なくともどちらかが1の場合に結果として1が返り、両方とも0の場合は0になります。 

1 OR 1 = 1 
1 OR 0 = 1 
0 OR 1 = 1 
0 OR 0 = 0 

 A     0100 1010 1110 0111
 B     0101 1101 1101 0101
--------------------------
 AND)  0100 1000 1100 0101

 A     0100 1010 1111 0111
 B     0101 1101 1101 0101
--------------------------
 XOR)  0001 0111 0011 0010

 A     0100 1010 1111 0111
 B     0101 1101 1101 0101
--------------------------
 OR)   0101 1111 1111 0111

今後とも宜しくお願いします。


突っ込んでおくのが礼儀なのか?(捨てハン  2005-09-16 19:26:15  No: 125367

A     0100 1010 1111 0111
 B     0101 1101 1101 0101
--------------------------
 XOR)  0001 0111 0011 0010
              ↓
       0001 0111 0010 0010


VB初心者  2005-09-16 19:42:52  No: 125368

突っ込んでおくのが礼儀なのか?(捨てハン) さん
ご指摘ありがとうございました。


通ってみた  2005-09-16 20:57:46  No: 125369

あれ?解決してない・・・?

>>XOR 
>>両方のビットが異なる場合にだけ結果として1が返り、
>>その他の場合は0になります。 

っていうのは、質問の

>>どのビットが変化したかを取得する方法があれば、ご教示お願いします。

これそのものだよね?


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

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






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