提取 ASCII 整数的前 32 位
您有一个表示 128 位无符号整数 n 的 ASCII 字符串,即 0 <= n < 2^128。
给出一个算法来提取 n 的二进制表示的最高有效 32 位,并将它们作为它们编码的无符号 32 位整数返回。
有什么快速的方法可以做到这一点,即比实现自己的大数除法和模 2 运算更好的方法。 假设是 32 位机器,即没有 64 位内置类型。
示例: 为了简洁起见,我们采用 4 位整数并提取前 2 位:
2(0010) --> 0(00) 7(0111) --> 1(01) 8(1000) --> 2(10) 13(1101) --> 3(11)
这不是一个家庭作业问题。更新我的面试算法技能。
You have an ASCII string representing a 128-bit unsigned integer number n, i.e. 0 <= n < 2^128.
Give an algorithm to extract the most significant 32 bits of the binary representation of n and return them as the unsigned 32 bit integer they encode.
What is a fast way to do this, i.e. something better than implementing your own big number division and modulo 2 operations.
Assume a 32bit machine, i. e. you don't have 64-bit built-in types.
Examples:
For brevity, let's take 4 bit integers and extract the leading 2 bits:
2(0010) --> 0(00)
7(0111) --> 1(01)
8(1000) --> 2(10)
13(1101) --> 3(11)
This is NOT a homework question. Updating my algo skills for an interview.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我没有看到比简单地模拟(有限形式)128 位算术更有效的方法。
假设我们有一个函数
mul10add(a, b)
,它计算10*a + b
并返回结果的低 32 位以及进位值。如果我们有 64 位算术,它可以实现为(以伪代码):现在,我们采用正常的十进制到二进制算法并用四个 32- 表示 128 位数字
n
位字x
、y
、z
和w
使得n = x*2^96 + y*2^64 + z*2^32 + w
。然后,我们可以将对mul10add
的调用链接在一起,以执行n = 10*n + digitalToInt(decimal[i])
的等效操作。然而,我们实际上并不需要 64 位架构来实现
mul10add
。在 x86 上,我们有mul
指令,它将两个 32 位数字相乘,得到一个 64 位数字,其中高 32 位存储在edx
中,低 32 位存储在中>eax
。还有adc
指令,它将两个数字相加,但包含先前add
中的进位。因此,在伪汇编中:I don't see a more efficient way than to simply emulate (a limited form of) 128 bit arithmetic.
Let's say we have a function
mul10add(a, b)
which calculates10*a + b
and returns the lower 32 bits of the answer together with a carry value. If we have 64-bit arithmetic it can be implemented as (in pseudo-code):Now, we take the normal decimal-to-binary algorithm and represent the 128-bit number
n
with four 32-bit wordsx
,y
,z
andw
such thatn = x*2^96 + y*2^64 + z*2^32 + w
. We can then chain calls tomul10add
together to perform the equivalent ofn = 10*n + digitToInt(decimal[i])
.We don't actually need a 64-bit architecture to implement
mul10add
, however. On x86 we have themul
instruction which multiplies two 32-bit numbers to get a 64-bit number with the upper 32 bits stored inedx
and the lower ones ineax
. There's also theadc
instruction, which adds two numbers but includes the carry from a previousadd
. So, in pseudo-assembly: