我有一個位操作方法,它將一個數乘以五分之八,如果有一個餘數向0舍入,該方法有效,我幾乎理解了所有的。然而,當我審查它時,我意識到我不確定如何解釋舍入誤差,其中它會繞着更負的數字而不是0,並且我需要理解爲什麼該線路起作用。據我所知,將multiplyByFive 31位向右移只會檢查變量的符號,如果是負值,則產生所有的符號,所以如果使用7,將會產生所有的零,如果是正數,或者y是二元的,如果是負數。如果我的理解是正確的,那麼爲什麼要加上乘以五個八分之一併將總和除以8得到一個負數就沒有錯誤。位操作 - 理解舍入零偏置乘以負數的分數
int multFiveEights(int x) {
分解成由5相乘,然後通過8 除以變速它兩到左邊由四個相乘,加上X使得它由5
int multiplyByFive = (x << 2) + x;
如果結果是否定的,和2^31 = 7之前右移
int addNumber = 7 & (multiplyByFive >> 31);
11111111(如果按31右移時,負你全1)
將返回若爲陽性,1例全0的LSB,如果負
增加7 multiplyByFive佔錯誤
如果其負面它會嘗試向下舍朝向更負號去,所以取與它7分佔該錯誤/測試爲一個剩餘
int fiveEigths = (multiplyByFive + addNumber) >> 3;
return fiveEigths;
如果'x'是肯定的,那麼你明白爲什麼'X/8'幾輪下來,但'(X + 7)/ 8'四捨五入? – immibis