Jako dane wejściowe zostanie podana liczba całkowita kz zakresu od -4503599627370496(-2 52 ) do 4503599627370496(2 52 ). Jak dobrze wiadomo , liczby całkowite w tym zakresie można przedstawić dokładnie jako wartości zmiennoprzecinkowe podwójnej precyzji.
Zalecana moc na wadze Hamminga (liczba jedynek) z kodowaniem kw formacie binary64 . Wykorzystuje to 1 bit dla znaku, 11 bitów dla wykładnika wykładnika (zakodowanych z przesunięciem) i 52 dla mantysy; zobacz powyższy link, aby uzyskać szczegółowe informacje.
Na przykład liczba 22jest reprezentowana jako
0 10000000011 0110000000000000000000000000000000000000000000000000
Ponieważ są 5takie, wynikiem jest 5.
Zauważ, że endianness nie wpływa na wynik, więc możesz bezpiecznie użyć rzeczywistej wewnętrznej reprezentacji wartości podwójnej precyzji w celu obliczenia wyniku.
Dodatkowe zasady
- Programy lub funkcje są dozwolone.
- Można użyć dowolnego języka programowania .
- Standardowe luki są zabronione
- Podana liczba będzie dziesiętna. Poza tym środki wejścia / wyjścia i format są jak zwykle elastyczne .
- Najkrótszy kod w bajtach wygrywa.
Przypadki testowe
22 -> 5
714 -> 6
0 -> 0
1 -> 10
4503599627370496 -> 5
4503599627370495 -> 55
1024 -> 3
-1024 -> 4
-4096 -> 5
1000000000 -> 16
-12345678 -> 16
binary64jako liczb całkowitych base2. Jeśli mimo to musisz poradzić sobie z nimi osobno, może warto zrobić coś innego niż pisanie na klawiaturze i zapętlić wszystkie bity.
longWydaje mi się, że chciałeś zostawić opcję napisania funkcji, która zajmuje , więc nie możesz po prostu powiedzieć binarnego64 double, ponieważ nie wszystkie liczby podwójne są liczbami całkowitymi. Ale wszystkie wartości całkowite doublemogą być konwertowane do longiz powrotem, do granic long. (Jak zauważyłeś, odwrotność nie jest prawdą. Otrzymujesz najbliższy reprezentowalny double, zakładając domyślny tryb zaokrąglania). W każdym razie był to całkowicie prawidłowy sposób postawienia pytania; Po prostu nie przeczytałem go dokładnie>. <
binary64formacie zmiennoprzecinkowym , jeśli chcą? Niektórzy ludzie (w tym ja, początkowo) zostały interpretacji pytanie, wymagając, aby zaakceptować funkcje wejść jako typ C na całkowitą podobnegolong. W C możesz argumentować, że język zostanie dla ciebie przekonwertowany, tak jak podczas rozmowysqrt((int)foo). Ale istnieją odpowiedzi ASM na kod maszynowy x86 (takie jak codegolf.stackexchange.com/a/136360/30206 i moje), które zakładały, że musimy zaakceptować 64-bitowe liczby całkowite. Zaakceptowaniebinary64wartości pozwoliłoby zaoszczędzić 5 bajtów.