2014-03-04 33 views
4

我需要乘以一個數字3/16,舍入爲零只使用按位操作,如! ~ &^| + << >>。到目前爲止,我有以下幾點,唯一的問題是當數字是負數時它不起作用,它總是舍入而不是零。我知道應該有點按位,如果聲明,如果x是負數然後加15.但我不知道如何實現它,任何幫助表示讚賞。如何乘以三十六分之一

int ezThreeSixteenths(int x) { 
    int times_two = x << 1; 
    int times_three = times_two + x; 
    int divide_eight = times_three >> 4; 
    int a = 0b11111111; 
    int a1 = a << 8; 
    int a2 = a << 16; 
    int a3 = 0b11111 << 24; 
    int mask = a | a1 | a2 | a3; 
    int final = divide_eight & mask; 
    return final; 
} 
+3

''4'不除以8,它除以16.注意位移最適合無符號整數。右移有符號數是實現定義的(即符號位可以保留或不可以)。 – Jens

+0

帶有位掩碼的非負int && -ed,只有符號位爲「1」時產生「0」。 – trutheality

+0

檢查此鏈接(http://stackoverflow.com/questions/22077554/in-c-bits-multiply-by-3-and-divide-by-16/22078232#22078232) – LearningC

回答

0

如果您有您滿意的作品時,它的正面功能,測試MSB檢測陰性位,如果是採取補(你不說你是否可以使用-以及+,但你可以使用^+),運行你的函數,然後再次採用二進制補碼。

0

使用二進制補碼將負數轉換爲正數。那麼當你完成將正數轉換回負數?