Ti verrà dato come input un numero intero k
nell'intervallo da -4503599627370496
(−2 52 ) a 4503599627370496
(2 52 ). Come è noto , i numeri interi in questo intervallo possono essere rappresentati esattamente come valori a virgola mobile a precisione doppia.
Dovresti generare il peso di Hamming (numero di quelli) della codifica k
in formato binario64 . Questo utilizza 1 bit per il segno, 11 bit per l'esponente (codificato con un offset) e 52 per la mantissa; vedere il link sopra per i dettagli.
Ad esempio , il numero 22
è rappresentato come
0 10000000011 0110000000000000000000000000000000000000000000000000
Dal momento che ci sono 5
quelli, l'output è 5
.
Si noti che l'endianness non influisce sul risultato, quindi è possibile utilizzare in modo sicuro l'effettiva rappresentazione interna della macchina dei valori di doppia precisione per calcolare l'output.
Regole aggiuntive
- Sono consentiti programmi o funzioni .
- È possibile utilizzare qualsiasi linguaggio di programmazione .
- Sono vietate le scappatoie standard
- Il numero di input sarà in decimale. Oltre a ciò, i mezzi e il formato di input / output sono flessibili come al solito.
- Vince il codice più breve in byte.
Casi test
22 -> 5
714 -> 6
0 -> 0
1 -> 10
4503599627370496 -> 5
4503599627370495 -> 55
1024 -> 3
-1024 -> 4
-4096 -> 5
1000000000 -> 16
-12345678 -> 16
binary64
intero come base2. Se è necessario gestirli separatamente, comunque, potrebbe valere la pena fare qualcosa di diverso da digitare-pun e passare da un loop all'altro.
long
, quindi non puoi semplicemente dire binary64 double
, perché non tutti i doppi sono numeri interi. Ma tutti i valori interi double
possono essere convertiti in long
e viceversa, fino ai limiti di long
. (Come sottolineato, il contrario non è vero. Si ottiene il più rappresentabile double
, assumendo la modalità di arrotondamento predefinita). Comunque, questo era un modo totalmente valido per porre la domanda; Non l'ho letto attentamente>. <
binary64
formato a virgola mobile se lo desiderano? Alcune persone (me compreso, inizialmente) interpretavano la questione richiede che funzioni accettano ingressi come un tipo intero come la C dilong
. In C, puoi sostenere che la lingua verrà convertita per te, proprio come quando chiamisqrt((int)foo)
. Ma ci sono alcune risposte asm di codice macchina x86 (come codegolf.stackexchange.com/a/136360/30206 e le mie) che presumevano entrambi che dovevamo accettare input interi a 64 bit. Accettare unbinary64
valore risparmierebbe 5 byte.