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. Ruby整数の抽出ビット
- 3. ビット操作を使用したビットの抽出
- 4. SSEを抽出するSSE2のみで32ビット値をシャッフル
- 5. AVX2レジスタから64ビット値の抽出を最適化する
- 6. vbaの浮動小数点からビットを抽出する
- 7. C内のダブルの右端Nビットを抽出
- 8. 任意のビットの位置と長さを持つビット境界間で値を抽出するC#
- 9. Clojure - 整数の最後のNビットを抽出する最速の方法は?
- 10. 大きい数値のビットを抽出する方法Numpyデータ型
- 11. ファイル名を抽出する
- 12. xslt - リーフノードを抽出する
- 13. スタイルシートビジュアルスタジオを抽出
- 14. プロパティを抽出
- 15. バイト境界にないビット位置から開始するバイト配列からバイトを抽出する方法#
- 16. パイソン抽出するワンライナーフィールド
- 17. HMACSHA256出力バイト/ビット
- 18. KMLから座標を抽出するBatchGeoファイルをPythonで抽出
- 19. C++ビット単位の操作を使用して画像から文字を抽出する
- 20. 64ビットのターゲットアプリケーションから32ビットのlibファイルを呼び出す
- 21. SSE:パックされた各バイトの符号ビットをパックされたレジスタに抽出する方法は?
- 22. 128ビットSSEベクトルから32ビット整数値をロードして抽出する最も効率的な方法は何ですか?
- 23. 抽出部
- 24. RTPシーケンス抽出
- 25. エンティティ抽出ライブラリ
- 26. 抽出値
- 27. ARMビットフィールド抽出?
- 28. キーワード抽出ソフトウェア
- 29. 抽出値は
- 30. FFMPEGビデオサムネールフレーム抽出
良い質問 - 私は同様に書いている逆アセンブラのためにこれを行う必要があります。 – new123456