Cで 私はアドレスを表す32ビットワードを持っています(そして、私はそれをunsigned longに格納しました。今私が集めたものから、アドレスの一部にはページ番号が含まれ、他の部分にはオフセットが含まれています。私はどのように私にページ番号を与えるビットを抽出することができたのだろうかと思っていた。私はすでに最初の22の最も重要なビットはページ番号であり、他の10ビットはページオフセットである。ページ番号のビットをどうやって取得できますか?私はいくつかのビット単位の操作でこれを行うことができると考えていますが、どうしたらよいか分かりません。ビットを抽出する
ビットを抽出する
答えて
bitshift演算子を使用して、必要なビットを抽出します。
pageNumber = x >> 10;
offset = x & ((1 << 10) - 1);
ページ番号の場合、>>演算子はビットをシフトダウンするため、最も重要でないビットが失われます。
オフセットの場合、((1 < < 10) - 1)は、10の最下位ビットのみを選択し、最上位ビットを無視するために使用される10のビットマスクを作成します。
ハードウェアが算術(符号拡張)右シフトを行う場合、ビットをシフトした後にビットをマスクすることは、このようなコードでは良い考えです。 pagenumber =(x >> 10)&((1 << 22)-1); –
私はフィールド抽出の "2つのシフト"方法の巨大なファンです。署名付きと署名なしの両方で動作します。 word
から最下位ビットlsb
と幅w
のフィールドを抽出するには:この場合
#define BITSIN(W) (8*sizeof(W))
return (word << (BITSIN(word) - (lsb+width))) >> (BITSIN(word) - width);
、BITSIN(word) == 32
とlsb+width == 32
は、その限り、当該単語が符号なしとして、あなただけのマスキングなしで右の10をシフトすることができます。
注意:32ビットタイプの32ビットシフトにご注意ください! C標準はコンパイラに何かをさせ、一般的なIntelのチップは役に立ちません:x << y
x
ビットがy % 32
ビット左にシフトします(x
は32ビット整数型です)。つまり、32ビット整数を32ビット左または右にシフトしようとすると、結果はノーオペレーションと同じになります。 64ビットタイプの64ビットシフトでも同様の問題があります。
「一般的なIntelのチップは役に立たない」 - 彼らは何をしていますか? – AShelly
@cellelly:良い質問です。私は答えを編集しました。誰が知っている、それは私にupvoteを得るかもしれない:-) –
- 1. ビット抽出とステガノグラフィ
- 2. 2次元のビット配列からビットを抽出する
- 3. Ruby整数の抽出ビット
- 4. ビット操作を使用したビットの抽出
- 5. ピクセルの最下位ビットの抽出
- 6. SSEを抽出するSSE2のみで32ビット値をシャッフル
- 7. uint8_t型配列からビットを抽出する
- 8. バイト配列からビットを抽出する
- 9. vbaの浮動小数点からビットを抽出する
- 10. Cの整数からビットを抽出するには?
- 11. AVX2レジスタから64ビット値の抽出を最適化する
- 12. 鍵のビットを抽出してペアリングする方法は?
- 13. は、整数配列から最初のビットを抽出/収集
- 14. C内のダブルの右端Nビットを抽出
- 15. u8バイトから7ビット符号付き整数を抽出
- 16. 任意のビットの位置と長さを持つビット境界間で値を抽出するC#
- 17. ビット配列の元の形式のバイト配列からビット配列を抽出する方法
- 18. 大きい数値のビットを抽出する方法Numpyデータ型
- 19. Clojure - 整数の最後のNビットを抽出する最速の方法は?
- 20. 重複情報を抽出するための抽出
- 21. HTMLから抽出して特定の行を抽出する
- 22. Cで64ビット値を出力する
- 23. Pythonエクセルセルを抽出する
- 24. Excelを抽出する - beginner
- 25. サブシーケンスPythonを抽出する
- 26. xslt - リーフノードを抽出する
- 27. 関数を抽出する
- 28. ファイル名を抽出する
- 29. ジップキンデータを抽出する
- 30. jmsテキストコンテンツを抽出する
良い質問 - 私は同様に書いている逆アセンブラのためにこれを行う必要があります。 – new123456