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進数のどのビットが変化したかを取得する方法があれば、ご教示お願いします。
ハミング距離…Xor演算?
ん〜まずは、10進を2進には変換できる?
ガッさん、いなさん
早速のご返答ありがとうございます。
ガッさんへ
>ハミング距離…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
前回のものは間違いでした。
10進を2進には変換ですが、
Function Dec2BinEx(Dec)
Do
Dec2BinEx = CStr(Dec Mod 2) & Dec2BinEx
Dec = Dec \ 2
Loop Until Dec = 0
End Function
XORが理解できないのであれば、
変更する前後で2進数の文字列を保存しておいて1文字ずつ比較する
方法でも、どこが変化したかは取得できるかと思います。
桁数はFormat関数でそろえるとしてですね。
数値同士をXorしてみればわかる
ただそれだけではありませんか・・・
ビット演算のXorは仕様上
元の値 Xor 比較対象 = (両者で一致しないビットだけ1になった値)
となりますので、比較したい値の型がByte,Integer,Longなら Xorを取ってから二進文字列にするだけでOKです。
何故そうなるかは排他的論理和の仕様をよく見ればわかります。
# 他にも指定ビットだけ反転とか、Xorを繰り返すことで1になっているビットの数が偶数か奇数かを判定するといった使い方があります。
>Function Dec2BinEx(Dec)
は
Function Dec2BinEx(ByVal Dec)
の方が良いかな、何かと。
s = Format(Dec2BinEx(7 Xor 8), String(2 ^ 3, "0"))
こんなことして何が起こるか見てみるとか。
KGさん 通ってみたさん ひろさん 我龍院忠太さん
早速のご返信を頂きまして誠にありがとうございました。
我龍院忠太さんのソースをもとにいろいろ試しています。
>s = Format(Dec2BinEx(7 Xor 8), String(2 ^ 3, "0"))
ひろさんへ
># 他にも指定ビットだけ反転とか、Xorを繰り返すことで1になっているビットの数が偶数か奇数かを判定するといった使い方があります。
甘えて申し訳ありませんが上記のサンプル等参考になるものがあれば教えていただけると助かります。
2進数「01」と「11」を、Or、And、Xorしてそれぞれの結果を比較してみてください
それで理解できると思います
通ってみたさん
ご返答ありがとうございました。
>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
今後とも宜しくお願いします。
A 0100 1010 1111 0111
B 0101 1101 1101 0101
--------------------------
XOR) 0001 0111 0011 0010
↓
0001 0111 0010 0010
突っ込んでおくのが礼儀なのか?(捨てハン) さん
ご指摘ありがとうございました。
あれ?解決してない・・・?
>>XOR
>>両方のビットが異なる場合にだけ結果として1が返り、
>>その他の場合は0になります。
っていうのは、質問の
>>どのビットが変化したかを取得する方法があれば、ご教示お願いします。
これそのものだよね?
ツイート | ![]() |