Jako dane wejściowe zostanie podana liczba całkowita k
z 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 k
w 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 22
jest reprezentowana jako
0 10000000011 0110000000000000000000000000000000000000000000000000
Ponieważ są 5
takie, 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
binary64
jako 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.
long
Wydaje 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 double
mogą być konwertowane do long
iz 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>. <
binary64
formacie 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. Zaakceptowaniebinary64
wartości pozwoliłoby zaoszczędzić 5 bajtów.