if (A and $80) <> 0 の意味

解決


ティモテ  2012-12-27 01:34:58  No: 43572

プログラムソースを見ていると

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
ではダメなのでしょうか?

よろしくお願いします。


deldel  2012-12-27 01:59:21  No: 43573

$80は、2進数では10000000です。
例えば、A =255 ですと、
A and $80 = 11111111 and 10000000 = 10000000
となります(論理演算ですね)。

要するに、8bit目が1か0かを判定していると思います。


Mr.XRAY  2012-12-27 02:10:00  No: 43574

こんちには,

>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
>と同じでしょうか?

これは論理演算の問題ですので,自分で考えるか,他の方のレスをお待ちください.
作成者自身が,自分で解釈しやすいように,書く場合があります.
うん,親切なレスですね (^^; えっ,違うって !?


Mr.XRAY  2012-12-27 02:10:47  No: 43575

あっ,かぶってしまいました.スミマセン.


ティモテ  2012-12-27 21:07:09  No: 43576

>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を行うことが可能でしょうか。


deldel  2012-12-27 21:32:19  No: 43577

色々実験してみると分かると思いますよ^^

最後の質問は、2進で書くと、以下でいいかなと。
(A and 11110001) or 00000010


DEKO  2012-12-27 21:52:48  No: 43578

> 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


ティモテ  2012-12-27 22:55:13  No: 43579

>deldel様、DEKO様
教えていただいたように
A := (A and $F1) or $02;
としたところ処理1が行えました。

一旦変更する部分を0にしてしまい、その後orで判定すると確かに1~3ビット目だけを変更することが可能ですね。気づきませんでした…

Byte型、$??の意味、について勉強になりました。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加