给定x = 1000位且y = 500位,最长x + y和xy是多少?
仅供参考:对于x + y和750k,答案不应该是1500,这就是为什么我感到困惑:(
答案 0 :(得分:3)
如果 x 的长度介于0和1000位之间,则 x 的值介于0和2 1000 -1之间。类似地,0≤ y < 2 500
因此,0≤ x + y ≤2 1000 + 2 500 - 2< 2 1001 ,所以 x + y 的长度最多为1001。
类似地,0≤ xy < 2 1500 , xy 的长度最多为1500。
答案 1 :(得分:1)
将其视为给定0-99之间的数字,并添加数字0-9,您最多需要多少位数? 3(2 + 1)。如果你有一个数字0-9999并且你添加一个数字0-99,你将需要最多5位数(4 + 1)。请注意它是最大数字的位数加一。所以答案是1001。
答案 2 :(得分:0)
考虑2位数。在最糟糕的情况下,你可以得到:
11b + 11b = 110b
因此3位就足够了,而不是2 + 2.对于最多N
的数字,您需要ceil(log(N))
位(其中log
表示与基数2
对数)。因此,如果您最多有两个数字N
且最多M
,则需要ceil(log(N+M))
位。
对于乘法,请考虑3位数:
111b * 111b = 110001b
这就是为什么它也不是参数位数的简单乘法。与上面的乘法类似,您需要ceil(log(N*M))
位。
答案 3 :(得分:0)
答案取决于您希望如何处理溢出(以及如何定义函数+
和*
)。
让我们采用符号var:bitwidth
来表示变量具有位宽位。这意味着你有以下声明,
x:1000
y:500
此外,我们采用这些以bigendian顺序存储的惯例(最右边的位是最小位,最左边是最大位)。我们很快得出结论,x+y
需要1001来处理溢出位,即
z0:1000, z1:1001
z0 = x + y //overflow possible, ex: x=2^1000-1, y=1
z1 = x + y //overflow not possible
乘法更难,考虑a:8
,b:8
,最广泛的结果是什么?
a:8, b:8
a = 11111111b //= 255
b = 11111111b //= 255
a * b == 1111111000000001 //=65025
//16 bits
似乎可以合理地预期乘法所需的位数是位的总和,除非你想要一个溢出位用于乘法溢出。
x:1000, y:5000
z:1500
z2:1499
z = x * y //would not have overflow
z2 = x * y //could have overflow
所有这些说,普通的微处理器只使用较大的宽度(:1000
),并且丢弃溢出或设置溢出位。答案是:1000
或:1000
加:1