たとえば、最初のステートメントと2番目のステートメントを書くことの利点は何ですか。
最初のステートメント:
ANCON1 = ~0x0C;
2番目のステートメント:
ANCON1 = 0xF3;
私は、2番目の選択を私が行ったであろう明確な選択と見なしています。これは、最初の選択よりも簡単だからです。必要なものを書くのがとても簡単なのに、なぜ1の補数を使用するのですか。
たとえば、最初のステートメントと2番目のステートメントを書くことの利点は何ですか。
最初のステートメント:
ANCON1 = ~0x0C;
2番目のステートメント:
ANCON1 = 0xF3;
私は、2番目の選択を私が行ったであろう明確な選択と見なしています。これは、最初の選択よりも簡単だからです。必要なものを書くのがとても簡単なのに、なぜ1の補数を使用するのですか。
All but 00001100
私は最初のものと2番目のものを読みました11110011
。精神的に設定されていないビットが少ないので、理解しやすいと思います。
ブノワはほとんどそれを言った。1つは補数であり、これらのビットを除くすべて、もう1つはこれらのビットだけです。
something&=~3;
多くの場合、0xFCが他のビットに焦点を合わせている2つのビットに焦点を合わせていることを意味します。〜バージョンは、一部のプラットフォームでの少し明確な指示に直接マップされているため、作成者はおそらくこの方法でそれを書くことについて気分が良くなります。また、〜バージョンではバグや間違いが発生しにくくなります。変数のサイズを変更しても(これらの2ビットを移動せずに)、コードは引き続き機能します。0xFCを使用すると、コードが壊れ、変数が使用されるすべての場所で修正する必要があります。(#defineを使用して定数を非表示にすると、デバッグが悪化します。定義を再利用すると改善される可能性がありますが、損傷はすでに発生しています)。
一日の終わりには、まるでスタイルのようなものですが
if(!(x&something) {
vs
if((x&something)==0) {
vs
if(x&something) ; else {
ドローイングやペインティングのクラスでは、ネガ、背景に焦点を当て、オブジェクトの輪郭を描くのではなく、オブジェクトではないものの輪郭を描くように教えられる可能性があります。
大学(電気工学、コンピュータ工学が存在する前の少なくとも数十年前)では、否定的な論理の観点から考えることが奨励されました。時々主張されるとは、正の論理、時には負の論理を意味し、一方向だけを考えてはいけません。(アサートまたはオンは正の電圧、VCCであり、ディアサートまたはオフはグランドであると考える場合も同様です)
特にこのビット演算を使用すると、「これらのビットをゼロにしている」と「これらのビットをゼロにしていない」のどちらの方法でもコードを読み取ることができます。どちらも正しいので、スタイルの違いだけです。
たとえば、口頭で言われたり、データシートにビット[3:2]は何かであり、ゼロの場合はこれと同じであると書かれている場合、0xCを0xF3と書くのは同じように「簡単」です。脳がそれを0xCとして処理し、それを0xF3として処理するには、物の長さに関する詳細情報を見つけて、0xF3に到達する前後のビットを処理する必要があります。または、0x0Cから頭の中で0xF3を実行し、〜0x0Cを使用してステップを保存することもできます。すべてのビットを並べてフィールドがマークされた図がある場合、ガラスは半分空または半分いっぱいになります。あなたとあなたの目は簡単にネガに焦点を合わせて0xF3を直接引くか、0x0Cに焦点を合わせてから反転します。 0xF3を取得するか、0xF3に焦点を合わせ、0x0Cを取得するには反転する必要があります。
1つは他よりもはるかに重要ではない2つの利点は、いくつかのプロセッサでは命令に直接結び付けられ、オプティマイザはそれほどハードに動作する必要がないことです(マイクロ最適化)。もう1つは、ソフトウェアのバグを回避する習慣です。数年前に0xFFFFFFF3でintを使用し、64ビットマシンに対して変更を加えずにそのコードを今日コンパイルした場合は、バグに陥った可能性があります。そのメソッドがコード全体で習慣的に使用されている場合は、多くの移植を行う必要があります。〜0xCが使用されていた場合、そのコードはよりスムーズに移植された可能性があります。1つは変数のサイズを意味し、もう1つはそうではありません。
両方の値が一定であり、最初の値がカウントされ、コンパイラによって2番目の値に最適化されるため、違いはありません。あなたや他のプログラマーがコードを理解しやすくするものを使用してください。
もう1つは、変数を使用した場合です。ほとんどのマイクロコントローラーで変数を否定してレジスターに書き込むには2つのコマンドを使用し、レジスターに変数を書き込むには1を使用します。
まず、〜はビット単位の補集合を意味します。これを1の補数と混同しないでください。1の補数は、16進数を符号付き整数形式に変換する方法です。
良い/悪い習慣に関しては、あなたの例は両方とも「魔法の数字」を使用しているので悪いです。同じコードを書く良い方法は
#define MASK 0x0C
ANCON1 = ~MASK;
MASKは意味のあるものであり、0xF3はランダムなマジックナンバーであるため、前者を使用してから反転する必要があります。
整数定数で使用される〜演算子は、コンパイル時に前処理されることに注意してください。実際のマシンコードはまだのようになりますLOADx $F3
。
それは通常、スタイルの問題です。1つ目は、のビットを除くすべてのビットのセットx = ~y
を示すために一般的に使用されるイディオムです。x
y
&=
オペレーターと一緒に使用するのがさらに一般的です。たとえば、に設定されているx &= ~y
ビットをクリアすることを意味します。この場合、たとえば、よりも書き込みの方が読みやすくなります。x
y
x &= ~0x40
x &= 0xFC