Каковы первые 32 бита дробной части этого числа? - PullRequest
6 голосов
/ 13 января 2011

Я смотрю на следующий SHA256 псевдокод в Википедии.

В частности, я смотрю на следующий раздел.

//Initialize variables
//(first 32 bits of the fractional parts of the square roots of the first 8 primes 2..19):
h0 := 0x6a09e667

Я пытаюсь понятьиз того, как h0 был сгенерирован.Из комментария я знаю, что это должна быть дробная часть квадратного корня из 2. Я полагаю, что могу получить дробную часть квадратного корня из 2, набрав следующее.Весь следующий код взят из реплик Python.

>>> math.modf(math.sqrt(2))[0]
0.41421356237309515

В верхней части файла указано, что объявление всех констант является Big Endian.Я знаю, что моя среда - Small Endian, потому что я печатаю.

>>> import sys
>>> sys.byteorder
'little'

Итак, согласно моей ручной манипуляции с шестнадцатеричным значением в h0, представление Little Endian должно быть 0x67e6096a.

>>> int(0x67e6096a)
1743128938

И я застрял.Я пробовал различные манипуляции, но ни один из них не заканчивается этим результатом.Я не знаю, как получить первые 32 бита дробной части числа с плавающей запятой.Я знаю, что каким-то образом мой результат 0.41421356237309515 (float) может быть преобразован в 1743128938 (int), но я действительно понятия не имею, как.Какие шаги необходимо выполнить, чтобы получить первые 32 бита дробной части числа с плавающей запятой?Python отвечает только, пожалуйста.

Спасибо.

Ответы [ 3 ]

9 голосов
/ 13 января 2011

Порядковый номер не имеет значения для шестнадцатеричных констант;каждая цифра - клев, с наименьшим значащим клоком последним.Это имеет значение, если вы имеете дело с указателями разного размера.Если вам нужно использовать порядки байтов, модуль struct может помочь.Во всяком случае, вы получили дробную часть просто отлично;преобразование его в шестнадцатеричный код легко сделать простым умножением и усечением, поэтому мы получаем целое число:

>>> hex(int(math.modf(math.sqrt(2))[0]*(1<<32)))
'0x6a09e667'
6 голосов
/ 13 января 2011
  1. Используйте свой калькулятор в Windows для расчета sqrt (2) (1.4142135623730950488016887242097)
  2. Взять десятичную часть (0,4142135623730950488016887242097)
  3. Умножить на 2 ^ 32 (1779033703.9520993849027770600526)
  4. Выразить всю часть в шестнадцатеричном виде (6A09E667)

Вуаля. (Извиняюсь перед OP за то, что не ответил на Python, но я надеюсь, что метод понятен.)

3 голосов
/ 13 января 2011
>>> math.sqrt(2).hex()
'0x1.6a09e667f3bcdp+0'

Срез по мере необходимости, например:

>>> '0x'+math.sqrt(2).hex().split('.')[1][:8]
'0x6a09e667'
...