プロが教える店舗&オフィスのセキュリティ対策術

計測器から制御信号 st Longを受け取るところまでは分かったのですが
OptionA.value = ((st and &H8) <> 0)
OptionB.value = ((st and &H4) <>0)
OptionC.value = ((st and &H40) <>0)
などの意味が分かりません。

&Hが16進数だとすると、
(st and &H40)は、stと&H40の各ビットを比較して、少しでも異なればTRUEになる
ということでよいでしょうか?

つまり、stも&H40であるかどうかを判定しているということ?

A 回答 (4件)

それはビットチェックの動作です。


longは処理系で変わるので何ビットか不明ですが、取り合えず8ビット(1バイト)で説明します。
2ビットの値が見やすいように4ビット毎に空白を入れて表示します。

&h8は2進数では、0000 1000
&h4は2進数では、0000 0100
&h40は2進数では、0100 0000

例えばstが7の時は2進数では、0000 0111
これとANDを取ると

0000 0111 st
0000 1000 &h8
--------------AND
0000 0000 =0 (OptionA.Value=False)

0000 0111 st
0000 0100 &h4
--------------AND
0000 0100 =&h4 <>0(OptionB.value=True)

0000 0111 st
0100 0000 &h4
--------------AND
0000 0000 =0 (OptionA.Value=False)

になります。
stが&h70の時は2進数では、0111 0000
これとANDを取ると

0111 0000 st
0000 1000 &h8
--------------AND
0000 0000 =0 (OptionA.Value=False)

0111 0000 st
0000 0100 &h4
--------------AND
0000 0000 =0(OptionB.Value=False)

0111 0000 st
0100 0000 &h4
--------------AND
0100 0000 =&h40 <>0 (OptionB.Value=True)

になります。
つまり、stの値をビット(2進数)に分解した時、特定のビットが1かどうかをチェックしています。
16進で表示してるのはプログラム上で人間が見やすくするためです。
初めは見やすくないと思うかもしれませんが16進と2進で、下の8個は(実質4個)は覚えてなければビット系の処理をする時に困ります。

0000 0001 &h1
0000 0010 &h2
0000 0100 &h4
0000 1000 &h8
0001 0000 &h10
0010 0000 &h20
0100 0000 &h40
1000 0000 &h80

と言う訳で
stが&h59の時は2進数では、0101 1001
これとANDを取ると

0101 1001 st
0000 1000 &h8
--------------AND
0000 1000 =&h8 <>0 (OptionA.Value=True)

0101 1001 st
0000 0100 &h4
--------------AND
0000 0000 =0(OptionB.Value=False)

0101 1001 st
0100 0000 &h4
--------------AND
0100 0000 =&h40 <>0 (OptionC.value=True)

になります。
    • good
    • 0
この回答へのお礼

ありがとうございました。
2進数はよく理解していましたが、ANDや<>がよく分かっていなかったので助かりました。

お礼日時:2018/09/11 09:42

No.3です。


回答の中の3か所の

0100 0000 &h4



0100 0000 &h40

の間違いです。
    • good
    • 0

No1です。


OptionA.value = ((st and &H8) <> 0)
は、stの右から4番目のビットがONならtrueなので
st=8,9,10,11,12,13,14,15、24等がtrueになります。
st=0~7、16等はfalseになります。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2018/09/11 09:39

&H8は2進数で1000です。

つまりstの右から4番目のビットが1ならtrueになります。(一番右側を1番目とします)
同様に&H4は3番目のビットが1ならtrueになります。&H40は7番目のビットが1ならtrueになります。

Debug.Print &H8; WorksheetFunction.Dec2Bin(&H8)
Debug.Print &H4; WorksheetFunction.Dec2Bin(&H4)
Debug.Print &H40; WorksheetFunction.Dec2Bin(&H40)
実行結果
8 1000
4 100
64 1000000
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2018/09/11 09:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!