問題タブ [bit-manipulation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C/C++ は、1 ビットが設定されているかどうかをチェックします。つまり、int 変数です。
ビットシフトとマスキングなしで、temp のビット 3 が 1 か 0 かを確認する方法はありますか。
このための組み込み関数があるかどうか、または自分で作成する必要があるかどうかを知りたいだけです。
c# - フラグでのビット演算子の使用
私は4つの旗を持っています
過去と未来の2つのフラグを受け取ったとします(setFlags(PAST | FUTURE)
)。中にあるかどうかはどうすればわかりPast
ますか?同様に、それが含まれていないことをどのように知ることCurrent
ができますか?そうすれば、考えられるすべての組み合わせをテストする必要はありません。
c - 定数シフトのみを使用して可変ビットシフトをエミュレートしますか?
変数 shift op またはブランチを実際に使用せずに、間接的な左/右シフト操作を実行する方法を見つけようとしています。
私が取り組んでいる特定の PowerPC プロセッサには、次のような定数による即時シフトという癖があります。
高速、単一操作、スーパースカラーであるのに対し、変数によるシフトは次のように
はマイクロコード化された操作で、実行に 7 ~ 11 サイクルかかり、残りのパイプライン全体が完全に停止します。
私がやりたいのは、sraw がデコードするマイクロコード化されていない整数 PPC ops を特定し、それらを個別に発行することです。これは、それ自体のレイテンシーには役立ちませんsraw
— 1 つのオペレーションが 6 つに置き換えられます — しかし、それらの 6 つのオペレーションの間に、一部の作業を他の実行ユニットに二重ディスパッチして、純利益を得ることができます。
μops sraw がデコードしたものをどこにも見つけられないようです — 可変ビットシフトを一連の定数シフトと基本的な整数演算に置き換える方法を知っている人はいますか? (正しく予測された分岐であっても、分岐ペナルティはマイクロコード ペナルティよりもさらに大きいため、for ループ、スイッチ、または分岐を含むものは機能しません。)
これはアセンブリで答える必要はありません。私は特定のコードではなくアルゴリズムを学びたいと思っているので、C言語や高級言語、さらには疑似コードでの回答があれば完全に役に立ちます。
編集:追加する必要があるいくつかの説明:
- 携帯性は少しも気になりません
PPC には条件付き移動があるため、分岐のない組み込み関数の存在を想定できます。
(同じことを行う三項を書き出すと、あなたの言いたいことがわかります)
- 整数乗算もマイクロコード化されており、
sraw
. :-( - Xenon PPC では、予測される分岐のレイテンシは 8 サイクルであるため、1 つでもマイクロコード化された命令と同じくらいコストがかかります。ポインターへのジャンプ (任意の間接分岐または関数ポインター) は、予測ミス (24 サイクルのストール) が保証されています。
assembly - SPARC - シフトなしのビットマスク
私は SPARC アセンブリを学んでおり、レジスタからフィールドを抽出するスクリプトを作成する必要があります。スクリプトは、初期番号、フィールド開始位置、フィールド長の 3 つの値を受け入れます。
シフト関数は使用できませんが、乗算と除算は使用できます。
私は現在、呼吸器ウイルスに苦しんでおり、その後かなりの量の薬を服用しています. 私はこれをどこから始めるべきかを理解するのに非常に苦労しています. いくつかの指示をいただければ幸いです。
c++ - C++ でビットごとのフラグをどのように使用しますか?
このWeb サイトに従って、16 ビット整数の 2 次元配列で迷路を表現したいと考えています。
各 16 ビット整数は、次の情報を保持する必要があります。
これを行う 1 つの方法を次に示します (これが唯一の方法ではありません)。12x16 の迷路グリッドは、16 ビット整数の配列 m[16][12] として表すことができます。各配列要素には、グリッド内の対応する 1 つのセルのすべての情報が含まれ、整数ビットは次のようにマップされます。
(ソース: mazeworks.com )壁を壊したり、境界線を設定したり、特定のパスを作成したりするには、1 つまたは 2 つの配列要素のビットを反転するだけです。
16 ビット整数でビットごとのフラグを使用して、これらのビットのそれぞれを設定し、それらが設定されているかどうかを確認するにはどうすればよいですか。
簡単に読める方法 (つまり、Border.W、Border.E、Walls.N など) でそれを行いたいと思います。
これは一般的にC++でどのように行われますか? それぞれを表すために 16 進数を使用する必要がありますか (つまり、Walls.N = 0x02、Walls.E = 0x04 など)? 列挙型を使用する必要がありますか?
単一のビットをどのように設定、クリア、およびトグルしますか?も参照してください。.
java - Java ビット操作
私が理解しているように、Javaはデータを2の補数、つまり-1 = 11111111(ウィキペディアによる)で保存します。
また、Javaドキュメントから:「ビットパターンは左側のオペランドで指定され、右側のオペランドでシフトする位置の数が指定されます。符号なしの右シフト演算子>>>」はゼロを左端にシフトします">>" の後の一番左の位置は符号拡張に依存します。"
つまり、 >>> は毎回 0 を左端にシフトします。したがって、このコードは
反復: x のビット表現
0: 11111111
1: 01111111
2: 00111111
3: 00011111
...すぐ
ただし、私の出力は常に X: -1 です。これは、>>> が符号ビットを一番左の位置に置いていることを意味します (推測します)。それで、>> を試してみると、同じ結果が得られました。
どうしたの?私の出力は、X: -1、x: 127、x: 63 などになると思います。
c++ - シフト操作
仲間のstackoverflowerの1人が投稿した次の投稿を見て、ちょっと唖然としました。
誰かが次のコード スニペットでシフト操作を説明しますか?
c - このビットごとの右シフトが機能しないように見えるのはなぜですか?
マスクがまったく右にシフトしない理由を誰かに説明してもらえますか? その 1 の代わりに何でも使用でき、結果は同じになります。