タグ付けされた質問 「bit-manipulation」

個々のビットの操作。使用される演算子には、ビット単位のAND、OR、XOR、NOT、左シフト、および右シフトがあります。

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 ...そう?


16
C ++での循環シフト(回転)操作のベストプラクティス
左および右シフト演算子(<<および>>)は、C ++ですでに使用可能です。しかし、循環シフトまたは回転操作を実行する方法を見つけることができませんでした。 「左回転」「右回転」などの操作はどのように行うのですか? ここで2回右に回転 Initial --> 1000 0011 0100 0010 結果として: Final --> 1010 0000 1101 0000 例が参考になります。 (編集者注:Cで回転を表現する多くの一般的な方法は、回転カウントがゼロの場合、または単一の回転機械命令以上にコンパイルされる場合、未定義の動作の影響を受けます。この質問の回答は、ベストプラクティスを文書化する必要があります。)

3
CHAR_BITとは何ですか?
http://graphics.stanford.edu/~seander/bithacks.htmlから分岐せずに整数絶対値(abs)を計算するコードを引用します。 int v; // we want to find the absolute value of v unsigned int r; // the result goes here int const mask = v >> sizeof(int) * CHAR_BIT - 1; r = (v + mask) ^ mask; 特許取得済みのバリエーション: r = (v ^ mask) - mask; それは何でCHAR_BIT、どのように使用しますか?

7
C / C ++:ビットフィールドの順序と配置を強制する
構造体内のビットフィールドの順序はプラットフォーム固有であると読みました。異なるコンパイラ固有のパッキングオプションを使用した場合、データが書き込まれるときに正しい順序で保存されることが保証されますか?例えば: struct Message { unsigned int version : 3; unsigned int type : 1; unsigned int id : 5; unsigned int data : 6; } __attribute__ ((__packed__)); GCCコンパイラを搭載したIntelプロセッサでは、フィールドは示されているようにメモリに配置されていました。Message.versionバッファの最初の3ビットであり、Message.typeその後に続きます。さまざまなコンパイラで同等の構造パッキングオプションを見つけた場合、これはクロスプラットフォームになりますか?



10
整数の1ビットが連続した領域にあるかどうかをテストするためのエレガントで高速な方法はありますか?
ビット値1の位置(32ビット整数の場合は0から31)が連続領域を形成するかどうかをテストする必要があります。例えば: 00111111000000000000000000000000 is contiguous 00111111000000000000000011000000 is not contiguous このテスト、つまりいくつかの関数has_contiguous_one_bits(int)を移植可能にしたいと思います。 明らかな方法の1つは、位置をループして最初のセットビットを見つけ、次に最初の非セットビットを見つけて、それ以上セットビットがないかどうかを確認することです。 もっと速い方法があるのだろうか?最高と最低のセットビットを見つけるための高速な方法がある場合(しかし、この質問から、ポータブルなものはないようです)、可能な実装は次のとおりです。 bool has_contiguous_one_bits(int val) { auto h = highest_set_bit(val); auto l = lowest_set_bit(val); return val == (((1 << (h-l+1))-1)<<l); } 楽しみのために、ここに連続したビットを持つ最初の100個の整数があります: 0 1 2 3 4 6 7 8 12 14 15 16 24 28 30 31 32 48 56 …

11
符号なしバイトの飽和減算/加算
私は2つの符号なしバイトを持っている想像bしてx。bsubasb - xとbaddasを計算する必要がありb + xます。ただし、これらの操作中にアンダーフロー/オーバーフローが発生することは望ましくありません。例(擬似コード): b = 3; x = 5; bsub = b - x; // bsub must be 0, not 254 そして b = 250; x = 10; badd = b + x; // badd must be 255, not 4 これを行うための明白な方法には、分岐が含まれます。 bsub = b - min(b, x); badd …


5
Java / Android colorintのアルファバイトを操作します
Androidカラー(Canvasでの描画用)として使用しているJavaのintがある場合、そのintのアルファコンポーネントのみを操作するにはどうすればよいですか?たとえば、これを行うために操作を使用するにはどうすればよいですか? int myOpaqueColor = 0xFFFFFF; float factor = 0; int myTransparentColor = operationThatChangesAlphaBytes(myOpaqueColor, factor); //myTransparentColor should now = 0x00FFFFFF; 理想的にfactorは、バイトを静的な値に設定するのではなく、最初のバイトに何でも乗算するとよいでしょう。

3
「マスクされた」ビットセットのインクリメント
私は現在、次の問題に遭遇したツリー列挙子を作成しているところです。 私はつまり、マスクされたビットセット、セットビットは、マスクのサブセットであり、すなわちビットセット、で探してい0000101たマスクで1010101。私が達成したいのはビットセットをインクリメントすることですが、マスクされたビットに関してのみです。この例では、結果はになります0010000。少し明確にするために、マスクされたビットのみを抽出します。つまり0011、それらをインクリメントして0100マスクビットに再度分配し、を与え0010000ます。 ビットスキャンとプレフィックスマスクの組み合わせを使用して手動で操作を実装する以外に、これを行う効率的な方法を誰かが見ていますか?

8
64ビット整数のパックされた8ビット整数を並列に1で減算、ハードウェアSIMDなしのSWAR
私が64ビット整数を持っている場合、それを8要素のパックされた8ビット整数の配列として解釈しています。1ある要素の結果が別の要素の結果に影響を与えることなくオーバーフローを処理しながら、各パック整数から定数を減算する必要があります。 私は現在このコードを使用していますが、機能しますが、パックされた各8ビット整数の減算を並列に実行し、メモリアクセスを行わないソリューションが必要です。x86では、psubbパックされた8ビット整数を減算するようなSIMD命令を並列で使用できますが、コーディング対象のプラットフォームはSIMD命令をサポートしていません。(この場合はRISC-V)。 したがって、SWAR(レジスタ内のSIMD)を実行して、のバイト間のキャリー伝播を手動でキャンセルしようとしています。uint64_tこれと同等の処理を実行します。 uint64_t sub(uint64_t arg) { uint8_t* packed = (uint8_t*) &arg; for (size_t i = 0; i < sizeof(uint64_t); ++i) { packed[i] -= 1; } return arg; } これはビット演算子で実行できると思いますが、よくわかりません。SIMD命令を使用しないソリューションを探しています。独自のソリューションを実装できるように、非常に移植性のあるCまたはC ++のソリューション、またはその背後にある理論だけを探しています。
77 c++  c  bit-manipulation  simd  swar 

6
(x | y)-yなぜ単純にxまたは `x | 0`
私はカーネルコードを読んでいて、ある場所で次のifようなステートメント内の式を見ました if (value == (SPINLOCK_SHARED | 1) - 1) { ............ } ここで、SPINLOCK_SHARED = 0x80000000事前定義された定数です。 なぜ(SPINLOCK_SHARED | 1) - 1型変換が必要なのでしょうか。式の結果は80000000になります-0x80000000と同じですよね?それでも、なぜORing 1とSubtracting 1が重要なのですか? 何かを手に入れられないような気がします。

3
与えられた2つの整数AとBについて、A = X * YおよびB = X xor YとなるようなXとYのペアを見つけます。
私は、競合するプログラミングの本で見つけたこの問題に苦労していますが、それを行う方法の解決策がありません。与えられた2つの整数AとB(64ビット整数型に適合可能)について、Aが奇数の場合、A = X * YとB = X xor YのようなXとYのペアを見つけます。私のアプローチはリストすることでしたAのすべての約数。sqrt(A)の下の数値とsqrt(A)上の数値をペアにして、Aまで乗算し 、それらのxorがBに等しいかどうかを確認します。しかし、それで十分かどうかはわかりません。この問題の良い解決策/アルゴリズムは何でしょうか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.