无法在C中尝试解决位级操作难题

时间:2015-04-25 20:25:54

标签: c bit-manipulation

所以我必须使用按位操作来解决这个问题。

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],所以我对我需要返回的内容感到困惑。

1 个答案:

答案 0 :(得分:1)

作为一般(!)规则,您可以将这些公式视为表达式x * N,仅使用移位和加法/减法:

A:(x

B:(x <&lt; n + 1) - (x <&lt; m)

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 <&lt; 6) - (2 <0)==(2 * 64) - (2 * 1)== 128 - 2 == 126(你可以尝试A为了你自己,它的工作正常。)

为了演示另一个数字的过程,假设N = 55且x = 2. 55二进制:011_0111。这次我们有两个1的序列。 n1 = 5,m1 = 4,n2 = 2,m2 = 0。

将B用于n1 / m1:(2 <&lt; 6) - (2 <4)==(2 * 64) - (2 * 16)== 128 - 32 == 96

使用B表示n2 / m2:(2 <3) - (2 <0)==(2 * 8) - (2 * 1)== 16 - 2 == 14

将两个结果一起添加产生110,即期望值。