所以我必须使用按位操作来解决这个问题。
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 :(得分: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 = 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,即期望值。n
到位位置m
的1位运行,其中n == m是可能的。