В качестве входных данных вы получите целое число k
в диапазоне от -4503599627370496
(−2 52 ) до 4503599627370496
(2 52 ). Как хорошо известно , целые числа в этом диапазоне могут быть представлены в точности как значения с плавающей запятой двойной точности.
Вы должны выход на вес Хемминга (количество единиц) в кодировании k
в формате binary64 . При этом используется 1 бит для знака, 11 бит для показателя степени (закодированный со смещением) и 52 для мантиссы; см. ссылку выше для деталей.
В качестве примера , число 22
представляется как
0 10000000011 0110000000000000000000000000000000000000000000000000
Так как есть 5
, выход 5
.
Обратите внимание, что порядковый номер не влияет на результат, поэтому вы можете безопасно использовать фактическое внутреннее представление вашей машины значений двойной точности для вычисления выходных данных.
Дополнительные правила
- Программы или функции разрешены.
- Любой язык программирования может быть использован.
- Стандартные лазейки запрещены
- Введенный номер будет в десятичном виде. Помимо этого, средства ввода и вывода и формат, как обычно, являются гибкими .
- Самый короткий код в байтах побеждает.
Контрольные примеры
22 -> 5
714 -> 6
0 -> 0
1 -> 10
4503599627370496 -> 5
4503599627370495 -> 55
1024 -> 3
-1024 -> 4
-4096 -> 5
1000000000 -> 16
-12345678 -> 16
binary64
целых чисел base2. В любом случае, если вам нужно обрабатывать их отдельно, возможно, стоит сделать что-то иное, нежели тип-каламбур и цикл по всем битам.
long
, так что вы не могли бы просто сказать что-нибудь двоичное64 double
, потому что не все двойные числа являются целыми числами. Но все целочисленные double
s могут быть преобразованы в long
и обратно, вплоть до пределов long
. (Как вы указали, обратное неверно. Вы получаете ближайшее представление double
, предполагая режим округления по умолчанию). Во всяком случае, это был совершенно правильный способ задать вопрос; Я просто не прочитал это внимательно>. <
binary64
формате с плавающей запятой , если они хотят? Некоторые люди (в том числе и я изначально) интерпретировали этот вопрос как требование, чтобы функции принимали входные данные как целочисленный тип, например Сиlong
. В C вы можете утверждать, что язык будет конвертировать для вас, так же, как когда вы звонитеsqrt((int)foo)
. Но есть некоторые ответы asm для машинного кода x86 (например, codegolf.stackexchange.com/a/136360/30206 и мой), которые оба предполагали, что нам нужно принять 64-битные целочисленные входные данные. Принятиеbinary64
значения сохранит 5 байтов.