CSAPP 2 75 求兩個32位無符號數相乘的高32位?

時間 2021-06-17 07:02:10

1樓:orpheus

2^64那項不用考慮是因為結果只精確到2^63位,換句話說結果是兩邊對2^64取模,所以最後那項就變成0了。

整個解題思路如下:

首先可以證明兩個32bit的乘積最多也不會超過64bit,所以精度肯定是夠的。在這個基礎上,偏移2^64的整數倍對結果沒有影響。例如考慮w=4的情況,對於無符號數15/31/47/...

其4bit表示都是1111,對於有符號數-7/9/...其4bit表示都是1001。

於是對於等式x'*y'=x*y+2^32*(x31*y+y31*x)+x31*y31*2^64,將=定義為在mod 2^64意義下的=,從而等式右邊可以隨意+或-(n*2^64),得到

x'*y' = x*y+2^32*x31*y+x^32*y31*x

因為想知道高32位的值,所以對兩邊同時除以2^32得到

無符號乘積高32位=有符號乘積高32位+(x<0?y:0)+(y<0?x:0)

完畢事實上,最後那個等式裡有符號乘積高32位和後面相加的x以及y,是有符號值還是無符號值都無所謂,原因也是有符號無符號的偏移量是2^32,在mod 2^32意義下是相等的。

2樓:

覺得可以這樣思考:當x = y = 0x80000000時,同為INT_MIN,按照上面的公式相乘,最後的2^64位則為1<<64,當用64位儲存時被捨去,這不正好滿足負負相乘得正嗎?而當非負負相乘的情況下,該項始終為0,同樣可以不考慮。

8個點位任兩個點位得電就有輸出,PLC用什麼指令?

skya 大概就是這麼個思路,看起來比較笨拙,但不容易出錯。當然也可以用上公升沿和下降沿進行加減計數獲取狀態。但是在實際程式設計時如果處理不好容易出錯。有時候笨辦法也有可取之處。 這個問題非常簡單!這個時候只需要MOV K2M0 D0 假設M就是點位,並且從M0開始 然後判斷D0裡的數不等於0 1 ...

求交換兩個整數最簡單的寫法?

猥瑣的民工 要快還是memcpy最快 temp new char sizeof a memcpy temp,a,sizeof a memcpy a,b,sizeof a memcpy b,temp,sizeof a delete temp 異或的做法只是不用中轉空間,論速度是肯定不如memcpy快的...

有兩個蔬菜大棚想種多肉求分析?

觀錦 其實,很多多肉愛好者都有乙個大棚夢。我這邊大棚,有2個本地陽台黨花友,在我這裡租了一條棚。大概8公尺x44的一條。沒想到2個人竟然把一條棚填滿了。而且,說實話,我養的不如她們好。但是經過小一年的相處,陽台種植模式和大棚種植模式是很不一樣的。夏季她們很多都化水。後來發現是全顆粒種植,並且夏季上架...