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

ビットパターンと2進数を直接操作する低レベルの基本操作

7
ビットマスクが「マスク」と呼ばれるのはなぜですか?また、それらの目的は何ですか?
「ビットマスク」がなぜこのように呼ばれるのですか? 私はそれらが主にビット単位の操作に使用され、ビットマスクの使用が個別の変数の使用よりも効率的であることを知っています。 しかし、私の質問は、ビットマスクが発明された理由と時期です。初期のコンピューティング以来使用されていましたか?ITドメイン内にビットマスク以外のタイプの「マスク」はありますか?

2
なぜビット演算子は比較よりも優先度が低いのですか?
理由を説明してもらえますか、なぜ最も一般的な言語の束(下記の注を参照)で比較演算子(==、!=、<、>、<=、> =)がビットごとの演算子(&、|、^ 、〜)? この優先順位が自然な使用法に出会ったことはないと思います。それは常に次のようなものです: if( (x & MASK) == CORRECT ) ... // Chosen bits are in correct setting, rest unimportant if( (x ^ x_prev) == SET ) // only, and exactly SET bit changed if( (x & REQUIRED) < REQUIRED ) // Not all conditions satisfied 私が使用する場合: flags = …

7
C ++でビットフラグにスコープ付き列挙型を使用する
enum X : int(C#)と、またはenum class X : int(C ++ 11)の隠れた内部フィールド有するタイプであるintことは、任意の値を保持することができます。さらに、いくつかの定義済み定数がX列挙型で定義されています。列挙型を整数値にキャストしたり、その逆を行うことができます。これは、C#とC ++ 11の両方に当てはまります。 C#では、列挙型は個々の値を保持するためだけでなく、Microsoftの推奨に従って、フラグのビットごとの組み合わせを保持するためにも使用されます。このような列挙型は(通常、必ずしもそうではありませんが)[Flags]属性で装飾されています。開発者の生活を楽にするために、ビット単位の演算子(OR、ANDなど)がオーバーロードされているため、次のようなことが簡単にできます(C#)。 void M(NumericType flags); M(NumericType.Sign | NumericType.ZeroPadding); 私は経験豊富なC#開発者ですが、C ++をプログラミングしてから数日しか経っていないため、C ++の規約については知りません。C#で使用したのとまったく同じ方法でC ++ 11列挙型を使用する予定です。C ++ 11では、スコープ付き列挙型のビット演算子はオーバーロードされないため、それらをオーバーロードしたかったのです。 これは議論を呼び起こし、意見は3つの選択肢の間で異なるようです: C#と同様に、ビット型を保持するために列挙型の変数が使用されます。 void M(NumericType flags); // With operator overloading: M(NumericType::Sign | NumericType::ZeroPadding); // Without operator overloading: M(static_cast<NumericType>(static_cast<int>(NumericType::Sign) | static_cast<int>(NumericType::ZeroPadding))); しかし、これはC ++ 11のスコープ付き列挙型の厳密に型指定された列挙型の哲学に反するでしょう。 列挙型のビットごとの組み合わせを保存する場合は、プレーン整数を使用します。 void …

13
バランスの取れたプログラマーは、ビット単位の操作をどの程度必要としますか?[閉まっている]
私は最近いくつかのOpenJDKコードを参照していますが、ビット単位の操作に関係する興味深いコードを見つけました。StackOverflowで質問したこともあります。 ポイントを説明する別の例: 1141 public static int bitCount(int i) { 1142 // HD, Figure 5-2 1143 i = i - ((i >>> 1) & 0x55555555); 1144 i = (i & 0x33333333) + ((i >>> 2) & 0x33333333); 1145 i = (i + (i >>> 4)) & 0x0f0f0f0f; 1146 i = i …

1
キャレットが累乗ではなくXORに使用されたのはなぜですか?
この構文上の問題に直面したことがある人にとっては本当に問題ではないというわけではありません^が、広く受け入れられている数学的な累乗演算の代わりにキャレット()をXOR演算として使用することに起因する大きな混乱が見られます。 もちろん、キャレットの(誤った)使用法を説明し修正する場所はたくさんありますが、キャレットに異なる意味が与えられた理由についての明確な情報源はありません。 それは利便性の問題でしたか?事故?明らかに、推論はさまざまな言語で異なる可能性があるため、あらゆる点で情報は洞察に満ちています。

11
Cでのシフトと乗算の時間の違いをテストすると、違いはありません。どうして?
バイナリのシフトは、2 ^ kを乗算するよりもはるかに効率的であると教えられました。だから私は実験したかったので、次のコードを使用してこれをテストしました。 #include <time.h> #include <stdio.h> int main() { clock_t launch = clock(); int test = 0x01; int runs; //simple loop that oscillates between int 1 and int 2 for (runs = 0; runs < 100000000; runs++) { // I first compiled + ran it a few times with …

15
ビット演算子は何に適していますか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 5年前に閉鎖されました。 プログラミング言語には、多くの場合、さまざまなビット演算子が付属しています(ビット単位の左シフトおよび右シフト、ビット単位のAND、OR、XORなど)。これらはあまり使用されませんが、少なくとも私の経験ではそうです。これらは、プログラミングの課題やインタビューの質問で使用される場合があります。または、ソリューションで必要になる場合があります。たとえば、 等値演算子を使用せずにtrue、2つの値が等しいときに戻る関数を作成します 3番目の変数を使用せずに、2つの変数の値を交換します これらは再び、おそらく実際の使用はほとんどありません。低レベルでメモリを直接操作するため、より高速になるはずです。 なぜこれがほとんどのプログラミング言語で見つかるのですか?現実のユースケースはありますか?

6
ビット演算を使用する利点は何ですか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 5年前に閉鎖されました。 最新のCodeProjectニュースレターを読んだ後、ビットごとの操作に関するこの記事に出会いました。興味深い読み物になります。整数が偶数か奇数かをチェックすることの利点は確かにわかりますが、n番目のビットが設定されているかどうかをテストしますか?これの利点は何でしょうか?

2
std :: bitsetよりもcスタイルのビット操作には利点がありますか?
私はほとんどC ++ 11/14でのみ動作しますが、通常、次のようなコードが表示されたときはうんざりします。 std::int64_t mArray; mArray |= someMask << 1; これは単なる例です。私は一般的にビット単位の操作について話しています。C ++では、本当にポイントがありますか?上記は心をゆがめ、エラーを起こしやすいですが、を使用すると次のstd::bitsetことができます: より簡単にサイズを変更します std::bitset必要に応じてテンプレートパラメータを調整し、実装に残りの処理を任せることで、ます。 何が起こっているかを考え出す(そして間違いを犯す可能性がある)時間を短縮std::bitsetし、同様の方法で、std::arrayまたは他のデータコンテナーに書き込みます。 私の質問は 下位互換性以外に、プリミティブ型を使用しない理由はありますstd::bitsetか?

4
お気に入りのビット単位のテクニックは何ですか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。回答は事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、場合によっては再開できると思われる場合は、ヘルプセンターをご覧ください。 7年前に閉鎖されました。 ロックされています。この質問とその回答はロックされています。なぜなら、質問はトピックから外れていますが、歴史的に重要だからです。現在、新しい回答やインタラクションを受け入れていません。 数日前、StackExchangeのメンバーであるAntoは、ビット単位の演算子の有効な使用方法について問い合わせました。私は、整数を2のべき乗で乗算および除算するよりも高速であると述べました。StackExchangeメンバーのDaeminは、右シフトが負の数の問題を引き起こしたと述べて反論しました。 その時点で、符号付き整数でシフト演算子を使用することを考えたことはありませんでした。私は主に低レベルのソフトウェア開発でこの手法を使用しました。したがって、常に符号なし整数を使用しました。Cは、符号なし整数で論理シフトを実行します。論理右シフトを実行する場合、符号ビットには注意が払われません。空白ビットはゼロで埋められます。ただし、Cは符号付き整数を右にシフトするときに算術シフト演算を実行します。空白ビットは符号ビットで埋められます。この違いにより、負の値はゼロに切り捨てられるのではなく、無限に丸められます。これは、符号付き整数除算とは異なる動作です。 数分考えた結果、一次解決策が生まれました。このソリューションは、シフトする前に条件付きで負の値を正の値に変換します。値は、シフト操作が実行された後、条件付きで負の形式に変換されます。 int a = -5; int n = 1; int negative = q < 0; a = negative ? -a : a; a >>= n; a = negative ? -a : a; このソリューションの問題は、通常、条件付き割り当てステートメントが少なくとも1つのジャンプ命令に変換されることであり、ジャンプ命令は、両方の命令パスをデコードしないプロセッサーでは高価になる可能性があります。命令パイプラインを2回再プラ​​イミングしなければならないことは、除算をオーバーシフトすることで得られるパフォーマンスの向上に良い影響を与えます。 上記で述べたように、私は土曜日に条件付き割り当ての問題に対する答えで目が覚めました。算術シフト演算を実行するときに発生する丸めの問題は、2の補数表現を操作する場合にのみ発生します。補数表現では発生しません。この問題を解決するには、シフト操作を実行する前に2の補数値を1の補数値に変換します。次に、1の補数値を2の補数値に変換する必要があります。驚くべきことに、シフト操作を実行する前に負の値を条件付きで変換することなく、この一連の操作を実行できます。 int a = -5; int n = 1; register int sign …

3
負の符号付き値はどのように保存されますか?
符号付き整数の最大値と最小値についてこのビデオを見ていました。 正の符号付きの値の例を挙げます-0000 0001最初のビットは数値が正であることを示し、最後の7ビットは数値そのものです。したがって、+ 1と簡単に解釈されます。 次に、負の符号付き値の例を取り上げます。10000000は-8になります。さて、コンピューターは最初のビットのために負の値であることを理解できますが、000 0000が-8を意味することを地獄はどのように理解していますか? 一般的に、負の符号付きの値はコンピューターでどのように保存/解釈されますか

3
「(int)値&0x1、(int)値&0x2、(int)値&0x4、(int)値&0x8」はどういう意味ですか? "
「値」の範囲は0〜15です(可能な値)。これらの4つの「if」条件はいつ満たされますか?(int)value = 2の場合、これは0010を意味しますか? if ((int)value & 0x1) { //statement here } if ((int)value & 0x2) { //statement here } if ((int)value & 0x4) { //statement here } if ((int)value & 0x8) { //statement here }

3
65535という数字に何か特別なものはありますか?
2¹⁶-1&2⁵=2⁵(または?明らかに?) 今日、開発者がビット単位の65535&32とは何か、つまり2¹⁶-1&2⁵=と尋ねた。最初は自発的に32と思っていましたが、数分考えて32と答えると簡単に思えました。32が正解だったようですが、どうですか。65535 =2¹⁶-1= 1111111111111111(ただし、この2進数はすべて-1(?)である必要があるため、正しくないようです)、32 = 100000ですが、変換できませんでした。何かに答える。答え32は実際には取るに足らないものですか?同じように2¹⁶-1&2⁵-1= 31ですか?開発者が正確に65535について質問したのはなぜですか? 私に評価を求められたバイナリは1111111111111111&100000でしたが、1111111111111111が-1ではない理由がわかりません。-1にすべきではありませんか?65535はオーバーフローを引き起こす数値であり、どうすればそれを知ることができますか?

2
すべてのブールロジックを「ブールナンド」だけを使用して構築する方法と同様に、「ビットワイズナンド」を使用してすべてのビットワイズ演算子を定義することは可能ですか?
Nand 他のすべてのブール論理ゲートを定義できるため、「ユニバーサル」論理ゲートと呼ばれます。 not(x) = nand(x,x) and(x, y) = not(nand(x, y)) or(x, y) = nand(not(x), not(y)) nor(x, y) = not(or(x, y)) xor(x, y) = nand(nand(a, nand(a, b)), nand(b, nand(a, b))) これはnand-logicと呼ばれ、トランジスタをnand-gateのように動作させることができるため、最近のコンピューターで一般的に使用されています。 私はビットごとの操作で同様のことを行うことが可能かどうか疑問に思っています。例えば缶ビット単位のNAND(bnand)を定義するために使用することはbnot、bor、band、bnor、bxor?汎用的なビット単位の操作はありますか?

3
<< >>乗算と除算の速度
を使用&lt;&lt;して&gt;&gt;、Pythonで数値を乗算およ​​び除算するために使用できます。バイナリシフトを使用すると、通常の除算または乗算よりも10倍高速です。 なぜ使用している&lt;&lt;と&gt;&gt;多くのよりも速く*と/? 背後で進行しているプロセス*と/それによって非常に遅いプロセスは何ですか?

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