PSRL(W)の挙動について
Posted: 2009年9月26日(土) 18:22
お邪魔します。
今回は、psrl(w)の挙動についてちょっと納得がいかなかったので
質問に来ました。
例えばですが、
0x48b749b64ab54bb4
をpsrlw 8で右論理シフトする(256で割る)と答えは
0x00480049004a004b
となるわけですが、これを
for(i=0;i<8;++i)
psrlw 1
で実行し、各値を見ていくと、添付ファイルのようになりました。
(上は16進数、下は2進数で結果を表記しています)
初めの状態から一回シフトすると自分の考えでは
以下のようになると思いました。
(2バイト単位で改行します)
0100100010110111
0100100110110110
0100101010110101
0100101110110100
↓
0010010001011011
0010010011011011
0010010101011010
0010010111011010
結果を予想と比較してみます。
予想:0010010001011011001001001101101100100101010110100010010111011010
結果:0010010001011111001001001101111000100101010111010010010111011100
これが微妙に違っています。
異なるのは、シフトによって消えていく部分なので、
今回の結果には影響しないのですが、なんだかしっくりきません。
右論理シフトはMSB=0,すべて一つ右にシフトと記憶していますが・・・
動作がPSRL(W)ではちょっと違うのでしょうか?
よろしくお願いします。
今回は、psrl(w)の挙動についてちょっと納得がいかなかったので
質問に来ました。
例えばですが、
0x48b749b64ab54bb4
をpsrlw 8で右論理シフトする(256で割る)と答えは
0x00480049004a004b
となるわけですが、これを
for(i=0;i<8;++i)
psrlw 1
で実行し、各値を見ていくと、添付ファイルのようになりました。
(上は16進数、下は2進数で結果を表記しています)
初めの状態から一回シフトすると自分の考えでは
以下のようになると思いました。
(2バイト単位で改行します)
0100100010110111
0100100110110110
0100101010110101
0100101110110100
↓
0010010001011011
0010010011011011
0010010101011010
0010010111011010
結果を予想と比較してみます。
予想:0010010001011011001001001101101100100101010110100010010111011010
結果:0010010001011111001001001101111000100101010111010010010111011100
これが微妙に違っています。
異なるのは、シフトによって消えていく部分なので、
今回の結果には影響しないのですが、なんだかしっくりきません。
右論理シフトはMSB=0,すべて一つ右にシフトと記憶していますが・・・
動作がPSRL(W)ではちょっと違うのでしょうか?
よろしくお願いします。