問題タブ [bit-shift]
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 でビット シフトするためのより基本的なガイドの方向に私を向けることができますか? 主題全体をカバーする必要があるため、非常に長いものになると思います。
私はC プログラミング言語(別名 K&R) を学んでおり、それが目的なので、演習を行うことができます。基本はわかったのですが、いまだに正しいビットシフト演算ができません。
これが私を困惑させたK&Rの演習です
練習問題 2-6: 位置 p から始まる n ビットを y の右端の n ビットに設定し、他のビットは変更せずに x を返す関数 setbits(x, p, n, y) を書きなさい。
演習 2-7: 位置 p から始まる n ビットを反転して (つまり、1 を 0 に、またはその逆に) x を返し、他は変更しない関数 invert(x, p, n) を書きなさい。
演習 2-8: n ビット位置だけ右に回転した整数 x の値を返す関数 rightrot(x, n) を書きます
演習 2-9: 2 の補数系では、x &= (x-1) は x の右端の 1 ビットを削除します。理由を説明し、この観察結果を使用して、ビットカウントのより高速なバージョンを記述します。
これらは、k&R (C プログラミング言語) の本からの演習です。これは最高の C の本ですが、ビット シフトを理解するのに苦労しているので、これらの演習に問題があります。
c - C プログラミングで乗算と除算を使用してビットをシフトできますか?
>>
and を使用し<<
てシフトする代わりに、 and を使用*
し/
て左右にシフトすることは可能ですか?
8 ビットの場合: 0x01 * 2 = 0000|0010。
c - このビットごとの右シフトが機能しないように見えるのはなぜですか?
マスクがまったく右にシフトしない理由を誰かに説明してもらえますか? その 1 の代わりに何でも使用でき、結果は同じになります。
c# - 32 ビット値をシフトするときに、シフト オペランドの下位 5 ビットのみを使用するのはなぜですか? (例: (UInt32)1 << 33 == 2)
次のコードを検討してください。
(32 より大きいシフトの使用に関する) 警告は生成されないため、予期される動作である必要があります。
生成されたアセンブリに実際に出力されるコード (または少なくとも Reflector によるコードの解釈) は次のとおりです。
IL (ここでも Reflector を使用) は
何が起こっているのか理解しています ( MSDNで説明されています)。コードがコンパイルされると、32 ビット値をシフトするときに下位 5 ビットのみが使用されます...なぜこれが起こるのか知りたいです。
(shift33a
出てくる方法は、ILのc#プレゼンテーションが別のものにコンパイルされるため、Reflectorで何かが正しくないと私に思わせます)
質問):
- 「シフトする値」の下位 5 ビットのみが使用されるのはなぜですか ?
- 「31 ビットを超えてシフトしても意味がない」場合、警告がないのはなぜですか?
- これは下位互換性の問題ですか (つまり、これはプログラマーが「期待」するものですか)?
- 基礎となる IL は 31 ビットを超えるシフトを行うことができますが (のように
L_0010: ldc.i4.s 0x21
)、コンパイラが値をトリミングしているというのは正しいですか?
c# - 左ビットシフト 255 (バイトとして)
以下がコンパイルされない理由を誰か説明できますか?
エラー:
定数値 '510' は 'byte' に変換できません
私はバイナリで次を期待しています:
型変換は私を困惑させました。
c# - オーバーフローしたビットを変数の他の先端に移動するC#ビット単位のシフト演算子はありますか?
それを「<<<」と呼びましょう
等しい
(<<および>>がオーバーフローしたビットを破棄すると仮定します)
そのようなオペレーターはいますか?
c++ - ゼロ ビットによるビット シフトは正しく機能しますか?
次のような関数があるとします。
毎回異なるサイトから呼び出され、bitCount
負でなく、 のビット数の範囲内になりますint
。私は特にbitCount
ゼロに等しい呼び出しについて心配しています-それは正しく動作しますか?
また、呼び出しサイトをコンパイルするときに関数のコード全体を確認しているコンパイラがbitCount
ゼロに等しい呼び出しをノーオペレーションに減らす可能性はありますか?
c# - C# でのビット シフトの混乱
次のような古いコードがあります。
長いので、次のように切り詰めることができると考えました。
しかし、最初の関数と同じ値が得られません。このバイトには 00000000 または 10000000 が含まれています。間違った演算子を使用していませんか?