为了账号安全,请及时绑定邮箱和手机立即绑定

将 64 位整数转换回两个 32 位整数

将 64 位整数转换回两个 32 位整数

哈士奇WWW 2021-12-17 10:46:31
我需要帮助逆转这个转换逻辑:word0 = np.uint32(3333333333)word1 = np.uint32(1111111111)temp64 = np.uint64(word0) * 1000000000temp64 = temp64 + np.uint64(word1)temp64现在保存时间戳的值。我需要将其转换回两个 32 位整数并到达word0 = 3333333333和word1 = 1111111111word0 = np.uint32(3333333333) # 32bitword1 = np.uint32(1111111111) # 32bittemp64 = np.uint64(word0) * 1000000000temp64 = np.uint64(temp64) + np.uint64(word1)temp32_0 = np.uint64((temp64)/1000000000)temp32_1 = np.uint64(temp64%1000000000)print(temp32_0)print(temp32_1)输出:3333333334111111168我需要回到33333333331111111111
查看完整描述

3 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

尝试使用4294967296而不是1000000000,这会使两个值重叠,从而不可分割。


无论选择什么因子,它都必须大于3333333333,而不是小于 。


看看使用较小的值33和11使用 factor会发生什么10。


33 * 10 + 11 = 341

然后提取:


341 / 10 = 34

341 % 10 = 1


查看完整回答
反对 回复 2021-12-17
?
SMILET

TA贡献1796条经验 获得超4个赞

还要考虑位移和另一个按位运算:


word0 = 3333333333

word1 = 1111111111

temp64 = (word0 << 32) | word1

print(temp64)

word00 = temp64 >> 32

word11 = temp64 & 0xFFFFFFFF

print(word00, word11)


>>14316557653012788679

>>3333333333 1111111111


查看完整回答
反对 回复 2021-12-17
?
呼如林

TA贡献1798条经验 获得超3个赞

首先,看看 line temp64 = np.uint64(word0) * 1000000000。如果您检查 类型temp64,它将是 numpy.float64!因此,您需要先将 1000000000 转换为 uint64。


没有 numpy 看起来更好:


# overlapping case

word0 = 3333333333

word1 = 1111111111

factor = 1000000000

temp64 = word0 * factor

temp64 = temp64 + word1


print(divmod(temp64, factor))


# non-overlapping case

word0 = 3333333333

word1 = 1111111111

factor = 10000000000  #extra zero added

temp64 = word0 * factor

temp64 = temp64 + word1


print(divmod(temp64, factor))


查看完整回答
反对 回复 2021-12-17
  • 3 回答
  • 0 关注
  • 438 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信