2015-04-25 40 views
0

因此,我必須使用按位操作來解決這個問題。試圖解決位級操作難題在C

Should duplicate effect of C expression (x*63), 
including overflow behavior. 
Examples: multi63(1) = 63 
    multi63(-1) = -63 
Available ops: ! ~ &^| + << >> 

也許我不理解的是什麼尋找,但我試着不同的變化,每一次我的結果要麼是真的接近什麼需要返回,但不正確。

這就是我目前正在玩的。我想如果我可以掩飾x,這是1的周長,那麼我會知道我是否乘以負面或正面。

int y = x>>31; 

return ~(y^x) 

這將返回:

Test times63(2147483647[0x7fffffff]) failed... 
...Gives -2147483648[0x80000000]. Should be 2147483585[0x7fffffc1] 

,如果我嘗試返回2147483585 [0x7fffffc1]它告訴我,我需要返回-2147483648 [0x80000000的]所以我很困惑,我需要什麼返回。

+0

那麼你怎麼在這裏乘以63? – harold

+0

'y =(x << 6)+〜x + 1',即y = x * 64 + -x'怎麼樣?假設一個普通的二進制補碼機器。 – doynax

+0

啊我甚至沒有想過乘以63,我太集中在正面/負面。謝謝,這很有道理。 – user3769402

回答

1

作爲一般規則,可以考慮這些公式用於表達式x * N,採用移位和僅加法/減法(!):

A:(X < < N)+(X < <正1)< < + ... + < <(X 米)

B:(X < < N + 1) - (X 米)

N可以看作0和1 [(0 ... 0)(1 ... 1)(0 ... 0)(1 ... 1)]的序列。你必須考慮從位位置n到位位置m的1的運行,其中n == m是可能的。

在你的情況N = 63,這是二進制011_1111。因此,我們有N = 5並且m = 0。 作爲簡單的例子假設X = 2:

使用B:(2- < < 6) - (2- < < 0)==(2 * 64) - ( 2 * 1)== 128 - 2 == 126(您可以自己試試A,它可以很好地工作。)

只是爲了演示另一個數字上的過程,假設N = 55和x = 2。 55二進制:011_0111。這次我們有兩個1的序列。 N1 = 5,M1 = 4和n 2 = 2,M2 = 0

採用B爲N1/M1:(2 < < 6) - (2- < < 4)==(2 * 64) - (2- * 16)== 128 - 32 96 ==

採用B爲N 2 /平方米:(2 < < 3) - (2 < < 0)==(2 * 8) - (2 * 1)== 16 - 2 == 14

將兩個結果相加在一起得到110,即期望值。