如何将大数字分成两个较小的整数然后重新组合大数?

时间:2017-12-14 00:43:33

标签: division modulo powerpc

我已尝试过以下但似乎最终没有获得正确的值: 我有一个可能大于32位的数字,因此我想将它存储到两个32位数组索引中。 我打破了他们:

int[0] = lgval%(2^32);
int[1] = lgval/(2^32);

并重新组装我试过的64位值: CPU:PowerPC e500v2

lgval= ((uint64)int[0]) | (((uint64)int[1])>>32);
由于我们处于大端,因此心灵向右移动。由于某些原因,我最终得不到正确的值,为什么不呢?我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

^运算符是xor,而不是幂。

您想要这样做的方式可能是:

uint32_t split[2];
uint64_t lgval;

/* ... */

split[0] = lgval & 0xffffffff;
split[1] = lgval >> 32;

/* code to operate on your 32-bit array elements goes here */

lgval = ((uint64_t)split[1] << 32) | (uint64_t)(split[0]);

正如Raymond Chen所说,endianness是关于存储的。在这种情况下,如果要将split-32-bit-int中的字节作为单个64位值访问,则只需要考虑字节序。无论如何,这可能不是一个好主意。