私はCSAPPを読んで宿題に関する質問を完了しようとしています。 w = 32と仮定すると、2.75は、32ビットの符号なし整数を2つ増やして上位32ビットを得ることです。与えられた関数int signed_high_prod(int x, int y)
は、xの上位32ビットを計算します。 xとyが2の補数形式である場合のy unsigned int unsigned_high_prod(unsigned x, unsigned y)
の実装にはint signed_high_prod(int x, int y)
を使用する必要があります。2つの符号なし整数(HW)を乗算する32ビットを得る
グーグルで私はx'.y' = x.y + x.y_31.2^32 + y.x_31.2^32 + x_31.y_31.2^64
を見つけました。ここで、x 'とy'はそれぞれxとyの符号なしの形式です。
私はまだ答えを理解できません。
unsigned unsigned_high_prod(unsigned x, unsigned y){
unsigned p = (unsigned) signed_high_prod((int) x, (int) y)
if((int) x < 0){
p += y;
}
if((int) y < 0){
p += x;
}
return p;
}
なぜ最終結果が結果に影響しないのですか?なぜx < 0
だからx_31 = 1
、プラスy
? y
と同じです。
剰余2³²が行われた場合には、いくつかのビットが失われ得るのだろうか? – user2018791
@ user2018791この場合ではありません。乗算の結果は64ビットに収まります。マイナスの無限大( 'floor')に丸められた2 32で除算すると、上位32ビットが得られます。 32-bit、unsignedのmod232はそれに影響を与えません。 –
@ user2018791最後のmod2³²ステップは、主に 'unsigned_high_prod'関数がN(x)・N(y)・2³²を含む項を考慮する必要がないことを示しています。したがって、0 mod 2²に等しくなります。 (A mod N)+(B mod N)は(A + B)mod Nと同じであるため、mod 2²は各項ごとに個別に行われていても差はありません。私。 (⌊x・y /²¾Ý+ x・N(y)+ y・N(x)+ N(x)・N(y)・2³²)mod 2²は '⌊x・y /2³²⌋mod2³² + x・N(y)mod 2²+ y・N(x)mod 2 3 2 + N(x)・N(y)・2 3 2 mod 2²2。 –