プログラムソースを見ていると
if (A and $80) <> 0 then
…
という文があったのですが、これはどういう意味でしょうか?
具体的に疑問なのは以下の点です。
1.このif文は
if ((A <> 0) and ($80 <> 0)) then
と同じでしょうか?
2.デバッグモードで$80にカーソルを合わせると128となっており
どうやらバイナリの$80(?)は128ということのようなのですが
このif文は
if A <> 0 then
ではダメなのでしょうか?
よろしくお願いします。
$80は、2進数では10000000です。
例えば、A =255 ですと、
A and $80 = 11111111 and 10000000 = 10000000
となります(論理演算ですね)。
要するに、8bit目が1か0かを判定していると思います。
こんちには,
>if (A and $80) <> 0 then
この $80 というのは,変数 A が何を意味するかによって異なります.
例えば以下のリストの Button1Click のコメント文を参考にしてください.
http://mrxray.on.coocan.jp/Delphi/plSamples/081_RadixConversion.htm#list2
>if ((A <> 0) and ($80 <> 0)) then
>と同じでしょうか?
これは論理演算の問題ですので,自分で考えるか,他の方のレスをお待ちください.
作成者自身が,自分で解釈しやすいように,書く場合があります.
うん,親切なレスですね (^^; えっ,違うって !?
あっ,かぶってしまいました.スミマセン.
>deldel様、Mr.XRAY様
なるほどそういう意味だったのですね。
となると1.2.の質問はまとはずれなものでした。
このAはByte型で宣言されていたのですが
Byte型と数値で論理演算をする場合は1bitごとに比較するということですね。
例えば同じソース内にあった
A := A or $04;
でAが112だった場合は11100000と00000100を論理演算のorで取っているので
A = 11100100
という動作をするという認識でよいでしょうか。
また上の動作があっていたとすると
1,2,3ビット目のみを0,0,1に変更して0,4,5,6,7ビット目の値を変更したくない場合(※処理1)
([????001?]という形にしたい。?は元のAの値から変更しない)
Aの1,2,3ビット目が元から0なら
A := A or &02;
で行えると思うのですが、Aの1,2,3ビット目に1が入っている場合はどのように処理1を行うことが可能でしょうか。
色々実験してみると分かると思いますよ^^
最後の質問は、2進で書くと、以下でいいかなと。
(A and 11110001) or 00000010
> 1,2,3ビット目のみを0,0,1に変更して0,4,5,6,7ビット目の値を変更したくない場合(※処理1)
この場合、
元データ : 10101010 ($AA)
Bitマスク: 11110001 ($F1)
一旦、マスクで AND をとって、
マスク後 : 10100000 ($A0)
データ : 00000010 ($02)
データと OR します。
OR 後 : 10100010 ($A2)
Byte 型の変数 A に元データがセットされている場合、
A := (A and $F1) or $02;
または、
A := (A and (not $0E)) or $02;
となります。
[ビットフィールドを操作する (Delphi 2006 以降...フル機能は 2009 以降)]
http://ht-deko.minim.ne.jp/tech076.html#tech133
>deldel様、DEKO様
教えていただいたように
A := (A and $F1) or $02;
としたところ処理1が行えました。
一旦変更する部分を0にしてしまい、その後orで判定すると確かに1~3ビット目だけを変更することが可能ですね。気づきませんでした…
Byte型、$??の意味、について勉強になりました。
ありがとうございました。
ツイート | ![]() |