Para cualquier 1 ≤ n ≤ 0xFFFFFFFF
salida positiva de entero de 32 bits ( ), el número de bits necesarios para representar ese entero.
Casos de prueba
| n | n in binary | bits needed |
|----------------------------------|
| 1 | 1 | 1 |
| 2 | 10 | 2 |
| 3 | 11 | 2 |
| 4 | 100 | 3 |
| 7 | 111 | 3 |
| 8 | 1000 | 4 |
| 15 | 1111 | 4 |
| 16 | 10000 | 5 |
| 128 | 10000000 | 8 |
| 341 | 101010101 | 9 |
4294967295 => 11111111111111111111111111111111 => 32
Entonces f(16)
imprimiría o devolvería5
Este es el código de golf . El código más corto en bytes gana
floor(log2(num))+1
num
es un poder de dos.Respuestas:
05AB1E , 2 bytes
Pruébalo en línea!
fuente
bg
bg
.bg
en juegos significabad game
:)JavaScript (ES6), 18 bytes
fuente
n>>>1
para apoyarn > 0x7FFFFFFF
?>>
falló enn
esa altura. Gracias.f=(a,b=1)=>a>1?f(a>>1,++b):b
Asamblea x86, 4 bytes
Suponiendo constante en
EBX
:EAX contiene el número de bits necesarios para Constant.
Bytes:
☼¢├@
Hexadecimal:
['0xf', '0xbd', '0xc3', '0x40']
fuente
Python , 14 bytes
Pruébalo en línea!
fuente
bit_length
esbit_length()
.int.bit_length(n)
yn.bit_length()
haz exactamente lo mismo.int.bit_length(n)
es una llamada de función y, por lo tanto, un fragmento que supone que la entrada se almacena en una variable. Esto es no permitido por las reglas, por lo que añadiendo(n)
haría que este no válida respuesta. Sin embargo, seint.bit_length
evalúa como una función y se puede guardar en una variable para su uso posterior. Esto está permitido por defecto.Laberinto ,
1312 bytesPruébalo en línea!
Explicación
El programa simplemente divide repetidamente la entrada por 2 hasta que sea cero. Se realiza un seguimiento del número de pasos duplicando el valor en cada paso. Una vez que se reduce a cero, imprimimos la profundidad de la pila (menos 1).
El programa comienza en el
?
que lee la entrada. El bucle principal es el bloque de 2x2 a continuación, en sentido antihorario:Una vez que el valor es cero después de una iteración completa, se ejecuta el bit lineal al final:
fuente
C, 31 bytes
... Entonces pensé en la recursividad. De oscuro a obvio, y con un cuarto de la longitud cayó.
Véalo en vivo en Coliru
C, 43 bytesLlamar
f
con un valor sin signo (por ejemplof(42u)
) "devolverá" su longitud de bits. Incluso funciona para0u
!Ungolfed y explicó: (se omiten las barras invertidas)
Véalo en vivo en Coliru
fuente
n?...:0
lo que no es necesario.#define f(n) ({64-__builtin_clzl(n);})
enfoque.Mathematica, 9 bytes
Alternativamente:
fuente
Perl 6 , 7 bytes
Intentalo
Explicación:
*
hace que se convierta en un lambda WhateverCode e indica dónde colocar la entrada.msb
en un Int devuelve el índice del bit más significativo (basado en 0)+1
se combina en el lambda y agrega uno al resultado final de la llamada.msb
.fuente
Macro de preprocesador C (con extensiones gcc), 26
Utiliza la función de recuento de ceros principales de GCC incorporada .
Llame a esto como una función, por ejemplo
f(100)
.Pruébalo en línea .
fuente
Retina ,
5637 bytesEsta solución funciona con todos los valores de entrada requeridos.
El mayor problema que enfrenta Retina en este desafío es el hecho de que sus cadenas tienen una longitud máxima de 2 ^ 30 caracteres, por lo que la forma habitual de tratar con números (representación unaria) no funciona con valores mayores de 2 ^ 30.
Para resolver este problema, adopté un enfoque diferente, manteniendo una especie de representación decimal de números, pero donde cada dígito está escrito en unario (llamaré a esta representación digitalunaria ). Por ejemplo, el número
341
se escribiría como111#1111#1#
en digitunary. Con esta representación ahora podemos trabajar con números de hasta2^30/10
dígitos (~ cien millones de dígitos). Es menos práctico que el unario estándar para la aritmética arbitraria, pero con un poco de esfuerzo podríamos hacer cualquier tipo de operaciones.El algoritmo que utilicé es hacer divisiones enteras sucesivas por dos hasta que lleguemos a cero, el número de divisiones que hicimos es el número de bits necesarios para representar este número.
Entonces, ¿cómo dividimos por dos en dígitosunarios? Aquí está el fragmento de Retina que lo hace:
Este reemplazo es suficiente para dividir un número digital numérico por 2, solo necesitamos eliminar posibles .5s del final si el número original era impar.
Entonces, aquí está el código completo, seguimos dividiendo por dos hasta que todavía hay dígitos en el número, y ponemos un literal
n
frente a la cadena en cada iteración: el númeron
al final es el resultado.Pruébalo en línea!
Solución actualizada, 37 bytes
Gran refactorización con muchas buenas ideas que jugaron alrededor de un tercio de la longitud, ¡todo gracias a Martin Ender!
La idea principal es usar
_
como nuestro símbolo unario: de esta manera podemos usar dígitos regulares en nuestra cadena, siempre y cuando los convertimos de nuevo a_
s cuando sea necesario: esto nos permite guardar muchos bytes en la división y en la inserción de múltiples dígitosAquí está el código:
Pruébalo en línea!
fuente
Ruby,
1916 bytesGracias Jordan por jugar golf 3 bytes
fuente
%
:->n{("%b"%n).size}
.->n{"%b"%n=~/$/}
.Jolf, 2 bytes
Simplemente convierta a binario y luego encuentre la longitud.
fuente
Julia 0.4 , 14 bytes
Pruébalo en línea!
fuente
JavaScript ES6, 19 bytes
Math.clz32
devuelve el número de cero bits iniciales en la representación binaria de 32 bits de un número. Entonces, para obtener la cantidad de bits necesarios, todo lo que tenemos que hacer es restar ese número de 32fuente
a=>1+Math.log2(a)|0
también es de 19 bytes.1+...|0
grita menos tilde !a=>-~Math.log2(a)
es 18herramientas bash / Unix, 16 bytes
Guarde esto en un script y pase la entrada como argumento. Se imprimirá el número de bits necesarios para representar ese número en binario.
Aquí hay una explicación:
dc es una calculadora basada en pila. Su entrada, analizada en tokens, es:
2 - Empuje 2 en la pila.
o: saca un valor de la pila (que es 2) y conviértelo en la base de salida (de modo que la salida ahora está en binario).
El valor del argumento para el programa bash ($ 1): inserta ese argumento en la pila.
n: extraiga un valor de la pila (que es el número de entrada) e imprímalo (en binario, porque esa es la base de salida) sin nueva línea final.
Entonces el comando dc imprime el número en binario.
La salida de dc se canaliza al comando wc con la opción -c, que imprime el número de caracteres en su entrada.
El resultado final es imprimir el número de dígitos en la representación binaria del argumento.
fuente
Hojas de cálculo de Google, 15 bytes
Toma la entrada de la celda
A1
y las salidas a la celda que contiene la fórmulao
o
Excel, 17 bytes
Igual que el anterior pero formateado para MS Excel
o
o
fuente
Pyth, 3 bytes
Conjunto de pruebas disponible aquí.
Explicación
fuente
hsl
o.El
, en el quel
calcula la base de registro 2, y /hs
o.E
calcula el techo.Jalea, 2 bytes
Convierte a binario, encuentra longitud.
fuente
C #,
634531 bytesGuardado 18 bytes, gracias a Loovjo y TuukkaX
Guardado 14 bytes, gracias a Grax
Utiliza que un número decimal n tiene ⌊log2 (n) ⌋ + 1 bits, que se describe en esta página:
fuente
...)+ 1)...
->...)+1...
. Además, creo que puede devolver el valor directamente en lugar de imprimirlo.b=>1+(int)System.Math.Log(b,2);
La conversión int proporciona el mismo resultado que Math.Floor y no necesita la declaración de uso si solo hace referencia al Sistema una vez.C #, 32 bytes
Convierte el parámetro en una cadena binaria y devuelve la longitud de la cadena.
fuente
Haskell, 20 bytes
Compone una función que toma el logaritmo base 2, pisos y agrega 1.
fuente
Befunge-93 ,
2321 BytesBefunge es un lenguaje de cuadrícula 2D (aunque solo estoy usando una línea).
Pruébalo en línea!
fuente
Medusa , 4 bytes
Pruébalo en línea!
Print (
p
), la longitud (#
) de la representación binaria (b
) de la entrada (i
).fuente
CJam , 5 bytes
Pruébalo en línea!
Lea input (
r
), convierta a entero (i
), obtenga representación binaria (2b
), obtenga length (,
).fuente
Octava , 19 bytes
Función anónima que suma 1, calcula el logaritmo binario y redondea.
Pruébalo en línea!
fuente
QBIC , 18 bytes
¡Eso es increíble Mike! pero como funciona?
fuente
Java 8,
3427 bytes¡Por una vez, Java tiene algunas funciones útiles! Ahora, solo necesitamos algunos nombres más cortos ...
Pruébalo en línea!
Por supuesto, puede hacer esto sin construir ( ver la respuesta de Snowman ), pero para un conteo de bytes más alto.
fuente
Octava, 19 bytes
Octave tiene dos funciones para convertir números decimales en números binarios.
dec2bin
convierte un número en una cadena de caracteres1
y0
(valores ASCII48
y49
). La longitud de la cadena será igual al número necesario de bits, a menos que se especifique lo contrario. Dado que los personajes1
y0
no son cero, podemos usarnnz
para encontrar el número de elementos de este tipo:@(x)nnz(dec2bin(x))
. Esto es de 19 bytes, por lo que está relacionado con la otra respuesta Octave de Luis Mendo .¿Podemos hacerlo mejor usando
de2bi
?de2bi
es una función que devuelve los números binarios como un vector con los números1
y0
como enteros, no como caracteres.de2bi
obviamente es dos bytes más corto quedec2bin
, pero ya no podemos usarlonnz
. Nosotros podemos utilizarnnz
si bien añadimos1
a todos los elementos, o lo hace en un vector lógico con sólotrue
valores.@(x)nnz(de2bi(x)+1)
y@(x)nnz(de2bi(x)<2)
son ambos de 19 bytes. Utilizandonumel
también nos dará 19 bytes,@(x)numel(de2bi(x))
.rows
es un byte más corto quenumel
, perode2bi
devuelve un vector horizontal, por lo que debe transponerse.@(x)rows(de2bi(x)')
Resulta que también son 19 bytes.fuente
Pyke, 3 bytes
Pruébalo aquí!
fuente
Retina ,
4423 bytesRequiere demasiada memoria para ejecutarse para valores de entrada grandes. Se convierte en unario, luego se divide repetidamente por 2, contando cuántas veces hasta llegar a cero. El recuento de bytes asume la codificación ISO 8859-1.
Pruébalo en línea
fuente