新米さんが早見表なるものをコメントくださいました。
そのコメントをみて気付いたことを書きます。
(正直なんで気付かなかったんだ??って感じですが。。。(笑))
XOR 排他論理OR の論理は
Result(結果)=A XOR B
としたとき、ビットの変化があったら1になり、変化がなければ0となる。
すなわち
A B Result(結果)
0 0 0
0 1 1
1 0 1
1 1 0
ということになるのですが。。。(何回も書いてますね)
結果がすでに分かっていて
AかBが分かっていれば、XORでもう1つを求めることができるのですよね (^−^;
Aをもとめたくて、Bとその結果が分かっているなら
A = B XOR Result(結果)
となりますね・・・・
きっと、新米さんもそれを承知していて、計算したのしょうが、
EXCELで計算させたいと思っても、EXCELが用意している関数では
XORがなぜかない・・・(とおもう・・)
なので、作成してみました。
EXCEL2003なので、今ので動くかは保障しませんが、動くんじゃないかな??(^−^
自作したのはXOR_ABという関数で
ツール→マクロ→Visual Basic Editor でVBをひらき、
挿入→モジュールで白紙のモジュールを開いたところで
ソースをコピー&ペーストして保存します。
ソースコードは仕事中の合間1時間くらいでざっと作ったので
16進文字列→10進あたりのコードはぼろぼろですが、一応動きます。
使い方はエクセルのfxから関数を入れ込みます。
パラメータは2つで、それぞれ任意のセルを指定します。
例 セルに直接書く場合はこんな感じです。
以下の記載をセルA1に書きます。
= XOR_AB(B1,C1)
B1とC1に4桁までの16進をそれぞれ入れると、
XORした結果がA1のセルに表示されます。
たとえば B1セルに 9001を
C1セルに 1010 を代入すれば、結果がA1に 8011と表示されます。
さっと作ったので、イレギュラー処理をいれてません。。なので16進を入れてくださいね・・♪
みなさんはもっとカッコよく作れると思いますので、参考程度で・・・
へんなことをしている
Function CHG_HEX16(XXX As String) As Integer 関数について軽く説明すると
文字列が1から9までの場合にはそのまま、で
大文字。小文字のAからFまでを10から15に変換して返却しています。
ASCBの関数では0は48、1は49という返り値となりますので、それを使用して
48からその値を引いて、INTタイプの0から9までを取得してます。
また、返り値でー1はエラーとしたのですが、上位モジュールで力つきて、判定してません。。><;
まぁ関数電卓たたけば、いいんでしょうけど・・ね・・・(趣味ですね)
この関数できるとですねぇ・・
データもってきて、EXCELにはりつけて、結果が9001のアドレスを探すっていうような
マクロにも使えますが、それは各自で・・・・(>。<)v
こんなので、どうでしょうね♪新米さん?♪
でわでわ・・・・
■ソース この文章から下をコピーして貼り付けます。
Function XOR_AB(A As String, B As String) As String
Dim TMP_DATA_A As Long
Dim TMP_DATA_B As Long
Dim RESULT_DATA As Long
'10進INTEGERに変換
TMP_DATA_A = STRHEX_TO_INT(A)
TMP_DATA_B = STRHEX_TO_INT(B)
'XOR
RESULT_DATA = TMP_DATA_A Xor TMP_DATA_B
'これを16進 文字列変換・・・
XOR_AB = Hex(RESULT_DATA)
End Function
Function STRHEX_TO_INT(A As String) As Long
Dim CNT As Integer
Dim SUM_A As Long
Dim TMP As String
Dim TMPDT As Long
' Aの文字列は4文字まで
If Len(A) = 0 Or Len(A) > 4 Then GoTo STEP_END
For CNT = 1 To Len(A) Step 1
TMP = (Mid(A, Len(A) + 1 - CNT, 1))
TMPDT = CHG_HEX16(TMP)
If TMPDT = -1 Then
'EROR
STRHEX_TO_INT = -1
GoTo STEP_END
End If
Select Case CNT
Case 1
SUM_A = TMPDT
Case 2
SUM_A = SUM_A + 16 * TMPDT
Case 3
SUM_A = SUM_A + 16 * 16 * TMPDT
Case 4
SUM_A = SUM_A + 16 * 16 * 16 * TMPDT
End Select
Next CNT
STRHEX_TO_INT = SUM_A
STEP_END:
End Function
Function CHG_HEX16(XXX As String) As Integer
Dim RT As Integer
Dim TMPD As Integer
TMPD = AscB(XXX)
Select Case TMPD
'A
Case 65, 97
RT = 10
'B
Case 66, 98
RT = 11
'C
Case 67, 99
RT = 12
'D
Case 68, 100
RT = 13
'E
Case 69, 101
RT = 14
'F
Case 70, 102
RT = 15
Case Else
' 0 から 9
If (TMPD - 48) < 10 And (TMPD - 48) >= 0 Then
RT = TMPD - 48
Else
RT = -1
End If
End Select
CHG_HEX16 = RT
End Function
|