转移大数字

问题描述 投票:1回答:2

X = 712360810625491574981234007851998使用链表表示,每个节点都是unsigned int

linked list of 712360-810625491-574981234-007851998

有快速的方法吗? qazxsw poi qazxsw poi除了 qazxsw poi qazxsw poi?

c++ linked-list bit-manipulation biginteger shift
2个回答
1
投票

任意位数的位移都非常容易。只记得将溢出的位移到下一个元素。就这样

下面是左移3个例子

X << 8

类似于向右移动,只是反向迭代。

Edit:

看起来您使用基数109作为您的大数字,因此二进制移位不适用于此处。在基数B中“移位”左/右N个数字相当于将数字分别乘以BN和B-N。你不能用十进制进行二进制移位,反之亦然

如果你没有改变你的基础,那么你只有一个解决方案,那就是将数字乘以2591.如果你想像二进制一样移动你必须改为X << 591,如232或base 264

一般解决方案是这样的,四肢以小端存储,每个数字在基础2CHAR_BIT * sizeof(T)

X * 2^8

此外,从标签中你可能会使用链表来存储肢体,由于元素在内存空间周围散布,因此它不会缓存,并且由于下一个指针而浪费了大量内存。事实上,在大多数现实生活中,你不应该使用链表

  • X * 2^591
  • uint64_t i1, i2, i3, o1, o2, o3; // {o3, o2, o1} = {i3, i2, i1} << 3; o3 = i3 << 3 | i2 >> (32 - 3); o2 = i2 << 3 | i1 >> (32 - 3); o1 = i1 << 3;
  • base that is a power of 2
  • template<typename T> void rshift(std::vector<T>& x, std::size_t shf_amount) // x >>= shf_amount { constexpr std::size_t width = CHAR_BIT*sizeof(T); if (shf_amount > width) throw; const std::size_t shift = shf_amount % width; const std::size_t limbshift = shf_amount / width; std::size_t i = 0; for (; i < x.size() - limbshift - 1; ++i) x[i] = (x[i + limbshift] >> shift) | (x[i + 1 + limbshift] << (width - shift)); x[i++] = x[i + limbshift] >> shift; for (; i < x.size() ; ++i) x[i] = 0; }
  • Bjarne Stroustrup says we must avoid linked lists

0
投票

我想,如果你使用64位整数代码应该是

Why you should never, ever, EVER use linked-list in your code again
© www.soinside.com 2019 - 2024. All rights reserved.