タグ付けされた質問 「bitwise-operators」

ビットレベルで操作を実行するために使用される演算子。プログラミング言語はバイト指向であり、ハードウェアはビット指向であるため、ビットレベルで操作できることは、特にプログラムがハードウェアと直接やり取りする場合、プログラミングで非常に重要になる可能性があります。 。


13
!!〜(チルド/バンバンチルドではない)は、「contains / included」配列メソッド呼び出しの結果をどのように変更しますか?
ここのjQuery inArrayページのコメントを読むと、興味深い宣言があります。 !!~jQuery.inArray(elm, arr) 今、私は二重感嘆符が結果をtype booleanに、の値で変換すると信じていますtrue。私が理解していないのは~、これらすべての中でチルダ()演算子がどのように使用されているのですか? var arr = ["one", "two", "three"]; if (jQuery.inArray("one", arr) > -1) { alert("Found"); } ifステートメントのリファクタリング: if (!!~jQuery.inArray("one", arr)) { alert("Found"); } 壊す: jQuery.inArray("one", arr) // 0 ~jQuery.inArray("one", arr) // -1 (why?) !~jQuery.inArray("one", arr) // false !!~jQuery.inArray("one", arr) // true また、チルダを前に置くと結果がになることにも気付きました-2。 ~!!~jQuery.inArray("one", arr) // -2 …

1
優先順位とビットマスク操作
(一見)非常に奇妙なケースに遭遇しました。 数2の(テイク0b10()と1とそれをビットマスク0b01) これは0b000に相当するものを生成するはずです。 ただし、ここでシュレーディンガー氏が登場します。 var_dump(0b10 & 0b01); // int(0) var_dump(0b10 & 0b01 == 0); // int(0) var_dump(0b10 & 0b01 != 0); // int(0) ウィスキー。タンゴ。Foxtrot。 確かに、ビット単位の演算子に関しては、私は最も鋭敏ではありません。恐らくどこかに恐ろしく、恐ろしく間違っているのでしょうか。 ただし、Pythonでは: 0b10 & 0b01 == 0 = True 0b10 & 0b01 != 0 = False ...そう?

9
C ++のブール値にビット演算子を使用する
C ++の「ブール」値にビット演算子&、|、および^を使用しない理由はありますか? 2つの条件のいずれか1つを真(XOR)にしたい状況に遭遇することがあるので、^演算子を条件式にスローします。また、条件のすべての部分を(短絡ではなく)結果が真であるかどうかを評価したい場合もあるので、&と|を使用します。また、ブール値を累積する必要がある場合もあります。&=と| =は非常に便利です。 これを行うと、眉毛が少し浮き上がりますが、コードはそれ以外の場合よりも意味があり、クリーンです。これらをboolsに使用しない理由はありますか?これに悪い結果をもたらす最新のコンパイラはありますか?

6
Androidでペイントフラグを削除する
私のコードは次のようになります: TextView task_text = (TextView) view.findViewById(R.id.task_text); task_text.setPaintFlags( task_text.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); これにより、取り消し線効果がテキストに表示されます。ただし、一度設定したフラグを削除する方法と、フラグが設定されたことを検出する方法を知りたいのですが。 これはビット演算であることは理解していますが、〜演算子と-演算子の両方を試しましたが、どちらも機能しません。

2
単一のパイプを使用するとどうなりますか '|' 関数の引数で行う?
たとえば、次のコードを考えてみましょう。 phpinfo(INFO_MODULES | INFO_ENVIRONMENT | INFO_VARIABLES); 単一の引数が使用されていますが、単一のパイプ記号で区切られたオプションのリストを提供しています。 関数の引数値は正確に何が起こっているのですか? 同じことを自分の関数で使用できますか? そうですか、代わりに配列を渡すと言うよりも、これには利点がありますか?

9
+演算子はCでどのように実装されていますか?
どのように原始的な事業者などの理解場合は+、-、*および/Cで実装されている、私はから次のスニペットを見つけた面白い答え。 // replaces the + operator int add(int x, int y) { while(x) { int t = (x & y) <<1; y ^= x; x = t; } return y; } この関数+は、バックグラウンドで実際にどのように機能するかを示しているようです。しかし、それを理解するには混乱しすぎます。このような操作は、コンパイラによって生成されたアセンブリディレクティブを使用して長い間行われていると思いました。 +オペレーターは、MOST実装に投稿されたコードとして実装されていますか?これは、2の補数または他の実装に依存する機能を利用していますか?

5
ビット演算は予期しない変数サイズになります
環境 PICマイクロコントローラー用の8ビットCコンパイラーを使用して最初にコンパイルされたCコードを移植しています。符号なしグローバル変数(たとえば、エラーカウンター)がゼロにロールオーバーしないようにするために使用された一般的なイディオムは次のとおりです。 if(~counter) counter++; ここでのビット演算子はすべてのビットを反転し、ステートメントが真であるのcounterは、最大値よりも小さい場合のみです。重要なことに、これは変数のサイズに関係なく機能します。 問題 現在、GCCを使用する32ビットARMプロセッサをターゲットにしています。同じコードが異なる結果を生成することに気づきました。私たちが知る限りでは、ビットごとの補数演算は予想とは異なるサイズの値を返すようです。これを再現するには、GCCでコンパイルします。 uint8_t i = 0; int sz; sz = sizeof(i); printf("Size of variable: %d\n", sz); // Size of variable: 1 sz = sizeof(~i); printf("Size of result: %d\n", sz); // Size of result: 4 出力の最初の行で、期待どおりの結果が得られますi。1バイトです。ただし、のビット単位の補数iは実際には4バイトであり、これとの比較では期待される結果が得られないため、問題が発生します。たとえば、次の場合(i適切に初期化されたはどこですかuint8_t): if(~i) i++; i0xFFから0x00までの「折り返し」が表示されます。この動作は、以前のコンパイラと8ビットPICマイクロコントローラーで意図したとおりに機能していた場合と比較して、GCCで異なります。 次のようにキャストすることでこれを解決できることを認識しています。 if((uint8_t)~i) i++; または、 if(i < 0xFF) …

5
少しブール値と比較する
私がuint16_tでエンコードされたフラグのセットを持っているとしましょうflags。たとえば、AMAZING_FLAG = 0x02。今、私には機能があります。この関数は、フラグを変更するかどうかを確認する必要があります。変更する場合は、フラッシュに書き込む必要があるためです。そしてそれは高価です。したがって、flags & AMAZING_FLAGがに等しいかどうかを確認するチェックが必要ですdoSet。これが最初のアイデアです。 setAmazingFlag(bool doSet) { if ((flags & AMAZING_FLAG) != (doSet ? AMAZING_FLAG : 0)) { // Really expensive thing // Update flags } } これは、直感的なifステートメントではありません。次のようなより良い方法があるはずだと思います。 if ((flags & AMAZING_FLAG) != doSet){ } しかし、これは、実際に仕事をしないtrueに等しくなるように思えます0x01。 それで、少しをブール値と比較するためのきちんとした方法はありますか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.