2012-01-23 15 views
3

を書くときに、なぜ1の補数を選択します。例えば第二の文対最初の文を書いて、ことの利点は何ですかレジスタに

最初の文:

ANCON1 = ~0x0C; 

第二文は:

ANCON1 = 0xF3; 

私は、私が作ったはっきりとした選択肢として第2のものを見ています。それは最初のものよりもまっすぐ進むからです。私たちが欲しいものを書くだけの理由で、補完を使うのはなぜですか?

答えて

3

ブノワがかなり言っています。 1つは補数であり、これらのビット以外はすべて、もう1つはこれらのビットです。

something&=~3; 

ここでは、0xFCが他のビットに焦点を当てている2つのビットに注目していることがよくあります。 〜バージョンは、おそらく作者がこれをおそらくこのように書いているように感じさせるいくつかのプラットフォーム上の少し明確な指示に直接マップされます。 〜バージョンはバグやミスを起こしにくいので、変数のサイズを変更しても(これら2つのビットを動かさなければ)、コードはまだ動作します。0xFCを使用すると、コードが壊れていて、 (定数を隠すために#defineを使用すると、デバッグが悪くなります。定義が再利用されても、それが改善されるかもしれませんが、損傷は既に行われています)。一日の終わりに

それはあなたがそうであるドローイングやペインティングクラスで

if(x&something) ; else { 

if((x&something)==0) { 

対ちょうど

if(!(x&something) { 

のようなスタイルのものですが背景に焦点を当てるように教えることは、オブジェクトの輪郭を描きませんが、オブジェクトの輪郭t。

大学(電気工学、少なくとも数十年前、コンピュータ工学が存在する前)では、私たちは否定論理の観点から考えることを奨励されました。時にはアサルトとはポジティブロジック、時にはネガティブロジックを意味し、一つの方法しか考えません。 (同じ考えがアサートされているか、または正の電圧である、VCCであり、デアサートされているか、またはオフである)

このビット操作では、特に「これらのビットをゼロにする」vs「Iこれらのビットをゼロにしていません "。どちらも正しいので、スタイルの違いだけです。

たとえば、口頭で言われた場合、またはビット[3:2]が何かであり、ゼロであるとデータシートに示されている場合、0xF3として0xCを書き込むのと同じように単純です。脳が0xCとして処理するためのストレッチではありませんが、0xF3として処理するには、物の長さに関する詳細情報を見つけて0xF3に達する前と後のビットを処理する必要があります。または、あなたは0x0Cからあなたの頭の中の0xF3をやっただけで、あなたは〜0x0Cを使用してステップを保存できました。すべてのビットを並べて表示した図がある場合は、半透明または半透明のガラスになります。あなたとあなたの目は簡単に負の値にフォーカスし、0xF3を直接引っ張り、0x0Cにフォーカスして反転します0xF3を取得するか、0xF3にフォーカスし、0x0Cを取得するために反転する必要があります。

2つの利点は、他のプロセッサよりもはるかに重要ではありませんが、いくつかのプロセッサでは命令に直接結びついており、オプティマイザはハード(マイクロ最適化)として動作する必要はなく、もう1つはソフトウェアのバグを避ける習慣です。数年前にintを0xFFFFFFF3で使用した場合、64ビットマシンに対して修正を加えずにそのコードを今日コンパイルした場合、バグに身を任せた可能性があります。そのメソッドが習慣的にコード全体で使用されていた場合は、実行するための移植がたくさんあります。 〜0xCが使用された場合、そのコードはよりスムーズに移植されている可能性があります。 1つは変数のサイズが他の変数にないことを意味します。

1

両方の値が一定であり、最初の値がカウントされ、コンパイラによって2番目の値に最適化されるため、違いはありません。あなたと他のプログラマーがコードを理解しやすくするものを使用してください。

は、他の事はあなたが否定して、2つのコマンドを使用して、ほとんどのマイクロコントローラ上のレジスタに変数を書き込むためにのみ登録する変数を記述するために変数を、使用される場合、私は最初に読ん1.

3

を使用しています1つはAll but 00001100で、もう1つは11110011です。少ししかないので、どのビットが精神的に設定されていないのかを理解するのが簡単です。

+0

@Mitch Wheat、ちょっと好奇心のために、ビットで話すとき、あるいはちょっと慣用ではないと「英語が間違っている」と言うのは間違っていますか? – Benoit

+0

私はそれがこの文脈で間違っていると信じています(しかし、訂正するのはうれしいです)。 –

+0

さらに、8ビットマイクロチップのタイマ持続時間レジスタのようにレジスタは実際にカウントダウンするかもしれません。 –

0

これは通常、スタイルの問題です。最初のx = ~yは、xのビットをすべてyのビットを除いて設定したことを示すためによく使用されるイディオムです。

さらに一般的には、演算子&=と一緒に使用されます。たとえば、x &= ~yは、xのビットをyに設定してクリアすることを意味します。この場合、書き込むのがより読み易くなります。たとえばx &= 0xFCではなくx &= ~0x40となります。

+0

いいえ、それは 'x&=〜y'です。 – Benoit

+0

ありがとう、私はそれを見つけ、すぐに答えを更新しました。 – Lindydancer

1

まず、〜はビット単位の補数を意味します。これを1の補数と混同しないでください。1の補数は、16進数を符号付き整数形式に変換する方法です。

良い/悪い習慣に関して、両方の例が「魔法の数字」を使用しているので、悪いです。同じコードを書くための良い方法は、マスクが理にかなっていると0xF3がいくつかのランダムなマジックナンバーである何かであるので、あなたは元を使用し、それを反転する必要があり

#define MASK 0x0C 

ANCON1 = ~MASK; 

だろう。

整数定数に使用される〜演算子は、コンパイル時に事前処理されることに注意してください。実際のマシンコードは、まだLOADx $F3のように見えます。

+0

賛辞の問題を解決してくれてありがとう。マスクが意味をなさないと思うのであれば、あなたはたぶんプログラムの中にいて、かなり理解しているでしょう。多分何をすべきかは、0b11110011 – Christian

関連する問題