Преобразование 64-разрядного целого числа обратно в два 32-разрядных целых числа - PullRequest
0 голосов
/ 27 марта 2019

Мне нужна помощь, чтобы изменить логику преобразования:

word0 = np.uint32(3333333333)
word1 = np.uint32(1111111111)

temp64 = np.uint64(word0) * 1000000000
temp64 = temp64 + np.uint64(word1)

temp64 теперь содержит значение метки времени.Мне нужно преобразовать это обратно в два 32-битных числа и получить word0 = 3333333333 и word1 = 1111111111

word0 = np.uint32(3333333333) # 32bit
word1 = np.uint32(1111111111) # 32bit

temp64 = np.uint64(word0) * 1000000000
temp64 = np.uint64(temp64) + np.uint64(word1)

temp32_0 = np.uint64((temp64)/1000000000)
temp32_1 = np.uint64(temp64%1000000000)

print(temp32_0)
print(temp32_1)

ВЫХОД:

3333333334
111111168

Мне нужно вернуться к

3333333333
1111111111

Ответы [ 3 ]

3 голосов
/ 27 марта 2019

Попробуйте использовать 4294967296 вместо 1000000000, из-за чего два значения перекрываются и, таким образом, будут неразделимы.

Какой бы фактор ни был выбран, он должен быть больше, чем 3333333333, а не меньше.

Посмотрите, что происходит с меньшими значениями 33 и 11, используя коэффициент 10.

33 * 10 + 11 = 341

И затем извлечение:

341 / 10 = 34
341 % 10 = 1
0 голосов
/ 27 марта 2019

Рассмотрим также битовые сдвиги и другие побитовые операции:

word0 = 3333333333
word1 = 1111111111
temp64 = (word0 << 32) | word1
print(temp64)
word00 = temp64 >> 32
word11 = temp64 & 0xFFFFFFFF
print(word00, word11)

>>14316557653012788679
>>3333333333 1111111111
0 голосов
/ 27 марта 2019

Прежде всего, посмотрите на строку temp64 = np.uint64(word0) * 1000000000.если вы проверите тип temp64, это будет numpy.float64!Итак, вам нужно сначала конвертировать 1000000000 в uint64.

Без клочка это выглядит лучше:

# 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))
...