0

今、私は本Computer Systems : Programmer Perspective を読んでいます。

本の 1 つの問題は、符号付き整数に対して論理右シフトを実行すると述べていますが、これを開始する方法がわかりません。

以下は、本からの実際の質問です。

次の C 関数のコードを入力します。

  • 関数srlは、算術右シフト ( value で指定xsra) を使用して論理右シフトを実行し、その後に右シフトや除算を含まない他の演算を実行します。

  • 関数sraは、論理右シフト ( value で指定xsrl) を使用して算術右シフトを実行し、その後に右シフトや除算を含まない他の演算を実行します。

この計算を使用して、データ型のビット数8*sizeof(int)を決定できます。シフト量の範囲は~です。wintk0w − 1

unsigned srl(unsigned x, int k) {
    /* Perform shift arithmetically */
    unsigned xsra = (int) x >> k;
    .
    .
    .
}

int sra(int x, int k) {
    /* Perform shift logically */
    int xsrl = (unsigned) x >> k; 
    .
    .
    .
}

質問を理解していただければ幸いです。

4

2 に答える 2

2

これは明らかに宿題であるため、完全な答えは提供しませんが、自分で解決するのに役立つヒントをいくつか提供します。

  • N ビットの論理右シフトの場合、算術シフト後に結果の上位 N ビットをクリアする必要があります。

  • 通常、ビットごとの AND または XOR を使用して、適切なマスクを適用することにより、値のビットをクリアできます。

  • 値の上位 N ビットをクリアするには、N 個の 0 と残りのビットが 1 のマスクが必要です。

  • ビット単位の左シフトを使用して適切なマスクを生成できますW - N。ここで、W は 1 ワードのビット数です (次のように計算できますW = sizeof(int) * CHAR_BIT;) 。

たとえば、2 による論理右シフトの場合

value              = 10001010
value >>= 2        = 11100010     // arithmetic right shift

mask               = 00111111     // mask has top 2 bits set to 0

value & mask       = 00100010     // apply mask to get logical right shift

最も難しい部分はマスクを生成することですが、シフトを適用して適切な値を適用し、その後にさらに 1 つのビット演算を行うことを考えると、かなり単純な解決策がすぐにわかるはずです。

于 2013-07-27T06:58:01.697 に答える
0

ポールが提案したように、マスクを作成するのに少し時間がかかりました. しかし、私は次のように作成しました。

まず、次のように1を左にシフトしました

1 << (sizeof(int)*8-k);

k を 10、INT サイズを 32 と見なすと、次のマスクが得られます

   00000000010000000000000000000000 ( 1 at 23 rd position 32 - 10 = 22 )

次に、-1 (0xffffffff) で追加します。

   00000000010000000000000000000000
 + 11111111111111111111111111111111
 +++++++++++++++++++++++++++++++++++

   00000000001111111111111111111111 --> required mask with first 10 bits set to 

算術シフトの結果と論理積すると、論理シフトの結果が得られます。

以下はCコードです

unsigned srl(unsigned x, int k) {
/* Perform shift arithmetically */
        unsigned xsra = (int) x >> k;
    int mask = (1 << (sizeof(int)*8-k)) + -1;
    int result = xsra & mask;
}

そしてそれは動作します。

于 2013-07-27T19:07:33.123 に答える