計測器から制御信号 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であるかどうかを判定しているということ?
No.3ベストアンサー
- 回答日時:
それはビットチェックの動作です。
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)
になります。
No.1
- 回答日時:
&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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAで時間(00:00形式)を積算(足し算)したい 1 2022/11/15 17:04
- Visual Basic(VBA) Worksheet_Change 4 2023/03/12 21:54
- Visual Basic(VBA) countifsについての質問 3 2023/03/08 13:45
- Visual Basic(VBA) ワークシートチェンジで曜日を表示する方法 1 2023/03/04 21:51
- Visual Basic(VBA) select caseの入れ子 3 2023/03/08 18:48
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- 電車・路線・地下鉄 初台→新宿3→代官山(7.6km)IC528円 笹塚→新宿3→中目黒(10.2Km)IC433円なぜ 5 2022/11/24 09:26
- その他(音楽・ダンス・舞台芸能) 高谷史郎の作品ST/LLに相当する洗練されたパフォーマンスを見せるアーティストは他にどんな方がいます 1 2023/02/18 21:31
- FTTH・光回線 ビッグローブ光とルーターの相性 2 2023/03/18 19:44
- 経済学 これカバーなし購買力平価の式らしいのですが、 iが1年後の自国の金利で、i*が外国の1年後の金利で、 3 2023/06/08 17:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
0xffffとは?
-
エクセルVBAのIf,Then 構...
-
ビットシフトってどんな時使うの?
-
一般のソフトで画像を扱う場合...
-
8ビットのデータの、先頭ビット...
-
fortran
-
03分22秒36のような時間の単位...
-
シーケンス制御についての質問...
-
情報科学の飽和演算、ラップア...
-
ビットの取り出し方法
-
verilog 符号付加減算(最上位...
-
スロースキャンコンピュータ 加...
-
16ビットCPUで32ビットの計算方法
-
上位ビットと下位ビットの入れかえ
-
PLC 命令について
-
[VBS] 素早くローテート演算したい
-
CASL2(減算命令と比較命令の...
-
シフト演算子について・・・意...
-
実数rの3乗はどうするの?
-
通常の表記から逆ポーランド表...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAのIf,Then 構...
-
0xffffとは?
-
8ビットのデータの、先頭ビット...
-
ビットシフトってどんな時使うの?
-
一般のソフトで画像を扱う場合...
-
シーケンス制御についての質問...
-
文字参照は10進数と16進数では...
-
算術シフト演算が成り立つ理由...
-
03分22秒36のような時間の単位...
-
Python: 数値を反転させたい
-
上位ビットと下位ビットの入れかえ
-
verilog 符号付加減算(最上位...
-
命令について
-
剰余の法が大きい場合のアルゴ...
-
ビット列を表示するプログラム
-
アクセス(2003)のVBAでビット...
-
16ビットCPUで32ビットの計算方法
-
C言語で128bitの2進数のビット...
-
10進数(+-)→2進数への変換(2)
-
シーケンス制御について質問で...
おすすめ情報