Pour tout entier positif sur 32 bits ( 1 ≤ n ≤ 0xFFFFFFFF
), indiquez le nombre de bits nécessaires pour représenter cet entier.
Cas de test
| 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
Donc f(16)
, imprimer ou retourner5
C'est du code-golf . Le code le plus court en octets gagne
floor(log2(num))+1
num
est une puissance de deux.Réponses:
05AB1E , 2 octets
Essayez-le en ligne!
la source
bg
bg
.bg
dans les jeux signifiebad game
:)JavaScript (ES6), 18 octets
la source
n>>>1
supportén > 0x7FFFFFFF
?>>
échoué surn
cette haute. Merci.f=(a,b=1)=>a>1?f(a>>1,++b):b
Assemblage x86, 4 octets
En supposant Constant dans
EBX
:EAX contient le nombre de bits nécessaires pour Constant.
Octets:
☼¢├@
Hexadécimal:
['0xf', '0xbd', '0xc3', '0x40']
la source
Python , 14 octets
Essayez-le en ligne!
la source
bit_length
estbit_length()
.int.bit_length(n)
etn.bit_length()
faire exactement la même chose.int.bit_length(n)
est un appel de fonction et constitue donc un fragment qui suppose que l'entrée est stockée dans une variable. Ceci est pas permis par nos règles, donc annexant(n)
rendrait invalide cette réponse. Cependant,int.bit_length
évalue une fonction et peut être enregistré dans une variable pour une utilisation ultérieure. Ceci est autorisé par défaut.Labyrinth ,
13 à12 octetsEssayez-le en ligne!
Explication
Le programme divise simplement l’entrée par 2 jusqu’à zéro. Le nombre d'étapes est maintenu en dupliquant la valeur à chaque étape. Une fois réduit à zéro, nous imprimons la profondeur de la pile (moins 1).
Le programme commence par le
?
qui lit l'entrée. La boucle principale est alors le bloc 2x2 ci-dessous, en sens antihoraire:Une fois que la valeur est zéro après une itération complète, le bit linéaire à la fin est exécuté:
la source
C, 31 octets
... Puis j'ai pensé à la récursivité. D'obscur à évident, et avec un quart de la longueur déposée.
Voir en direct sur Coliru
C, 43 octetsAppeler
f
avec une valeur non signée (par exemplef(42u)
) "retournera" sa longueur en bits. Même travaille pour0u
!Non golfé et expliqué: (barres obliques inverses omises)
Voir en direct sur Coliru
la source
n?...:0
n’est pas nécessaire.#define f(n) ({64-__builtin_clzl(n);})
approche.Mathematica, 9 octets
Alternativement:
la source
Perl 6 , 7 octets
L'essayer
Explication:
*
le fait devenir un lambda WhateverCode, et indique où mettre l'entrée.msb
sur un Int retourne l'index du bit le plus significatif (basé sur 0)+1
est combiné dans le lambda, et ajoute un au résultat final de l'appel.msb
.la source
Macro de préprocesseur C (avec extensions gcc), 26
Utilise le nombre de zéros de compte intégrés de GCC .
Appelez cela comme une fonction, par exemple
f(100)
.Essayez-le en ligne .
la source
Retina ,
5637 bytesCette solution fonctionne avec toutes les valeurs d'entrée requises.
Le problème le plus important auquel Retina est confrontée dans ce défi est le fait que ses chaînes ont une longueur maximale de 2 ^ 30 caractères. Par conséquent, la manière habituelle de traiter les nombres (représentation unaire) ne fonctionne pas avec des valeurs supérieures à 2 ^ 30.
Afin de résoudre ce problème, j’ai adopté une approche différente en conservant une sorte de représentation décimale des nombres, mais où chaque chiffre est écrit en unaire (je vais appeler cette représentation numérique ). Par exemple, le nombre
341
serait écrit comme111#1111#1#
dans digitunary. Avec cette représentation, nous pouvons maintenant travailler avec des nombres allant jusqu'à un2^30/10
chiffre (environ cent millions de chiffres). C'est moins pratique que le unaire classique pour l'arithmétique arbitraire, mais avec un peu d'effort, nous pourrions faire n'importe quel type d'opération.L'algorithme que j'ai utilisé consiste à faire des divisions entières successives par deux jusqu'à atteindre zéro, le nombre de divisions que nous avons fait est le nombre de bits nécessaires pour représenter ce nombre.
Alors, comment divisons-nous par deux en numérique? Voici l'extrait de la rétine qui le fait:
Ce remplacement est suffisant pour diviser un nombre numérique par 2, il suffit d’enlever les .5 possibles à la fin si le nombre initial était impair.
Donc, voici le code complet, nous continuons à diviser par deux jusqu'à ce qu'il y ait encore des chiffres dans le nombre, et mettons un littéral
n
devant la chaîne à chaque itération: le nombren
à la fin est le résultat.Essayez-le en ligne!
Solution mise à jour, 37 octets
Grand refactoring avec beaucoup de bonnes idées qui ont golfé environ un tiers de la longueur, tout cela grâce à Martin Ender!
L’idée principale est d’utiliser
_
comme symbole unaire: de cette manière, nous pouvons utiliser des chiffres normaux dans notre chaîne, à condition de les reconvertir en_
s lorsque cela est nécessaire: cela nous permet d’économiser de nombreux octets lors de la division et de l’insertion de multiples. chiffres.Voici le code:
Essayez-le en ligne!
la source
Ruby,
1916 octetsMerci Jordan pour le golf 3 octets
la source
%
:->n{("%b"%n).size}
.->n{"%b"%n=~/$/}
.Jolf, 2 octets
Il suffit de convertir en binaire, puis de trouver la longueur.
la source
Julia 0.4 , 14 octets
Essayez-le en ligne!
la source
JavaScript ES6, 19 octets
Math.clz32
renvoie le nombre de bits zéro dans la représentation binaire 32 bits d'un nombre. Donc, pour obtenir le nombre de bits nécessaires, il suffit de soustraire ce nombre de 32la source
a=>1+Math.log2(a)|0
est également 19 octets.1+...|0
crie moins tilde !a=>-~Math.log2(a)
est 18Outils bash / Unix, 16 octets
Enregistrez ceci dans un script et transmettez l'entrée sous forme d'argument. Le nombre de bits requis pour représenter ce nombre en binaire sera imprimé.
Voici une explication:
dc est une calculatrice basée sur des piles. Son entrée, analysée en jetons, est la suivante:
2 - Poussez 2 sur la pile.
o - Extrait une valeur de la pile (qui est 2) et en fait la base de sortie (la sortie est maintenant en binaire).
La valeur de l'argument du programme bash ($ 1) - Envoie cet argument dans la pile.
n - Extrait une valeur de la pile (qui est le numéro d'entrée) et l'affiche (en binaire, car c'est la base de sortie) sans fin de nouvelle ligne.
Donc, la commande dc affiche le nombre en binaire.
La sortie de dc est transmise à la commande wc avec l’option -c, qui affiche le nombre de caractères de son entrée.
Le résultat final consiste à imprimer le nombre de chiffres dans la représentation binaire de l'argument.
la source
Google Sheets, 15 octets
Prend les entrées de la cellule
A1
et les sorties dans la cellule qui contient la formuleou
ou
Excel, 17 octets
Comme ci-dessus mais formaté pour MS Excel
ou
ou
la source
Pyth, 3 octets
Suite de test disponible ici.
Explication
la source
hsl
ou.El
, quil
calcule la base de journal 2, eths
ou.E
calcule plafond.Gelée, 2 octets
Convertit en binaire, trouve la longueur.
la source
C #,
634531 octetsSauvegardé 18 octets, grâce à Loovjo et TuukkaX
14 octets sauvés, merci à Grax
Il utilise, qu'un nombre décimal n a ⌊log2 (n) ⌋ + 1 bits, ce qui est décrit sur cette page:
la source
...)+ 1)...
->...)+1...
. De plus, je pense que vous pouvez renvoyer la valeur directement au lieu de l’imprimer.b=>1+(int)System.Math.Log(b,2);
le ramener à 31 en faisant cela. La conversion int fournit le même résultat que Math.Floor et vous n'avez pas besoin de l'instruction using si vous ne faites référence à System qu'une seule fois.C #, 32 octets
Convertit le paramètre en chaîne binaire et renvoie la longueur de la chaîne.
la source
Haskell, 20 octets
Compose une fonction qui prend en logarithme 2, étages et ajoute 1.
la source
Befunge-93 ,
23 à21 octetsBefunge est un langage basé sur une grille 2D (bien que je n’utilise qu’une seule ligne).
Essayez-le en ligne!
la source
Méduse , 4 octets
Essayez-le en ligne!
Print (
p
), la longueur (#
) de la représentation binaire (b
) de l'entrée (i
).la source
CJam , 5 octets
Essayez-le en ligne!
Lire input (
r
), convertir en integer (i
), obtenir une représentation binaire (2b
), obtenir length (,
).la source
Octave , 19 octets
Fonction anonyme qui ajoute 1, calcule le logarithme binaire et arrondit.
Essayez-le en ligne!
la source
QBIC , 18 octets
C'est incroyable Mike! Mais comment ça fonctionne?
la source
Java 8,
3427 octetsPour une fois, Java a quelques fonctions utiles! Maintenant, nous avons juste besoin de noms plus courts ...
Essayez-le en ligne!
Bien sûr, vous pouvez le faire sans fonctions intégrées ( voir la réponse de Snowman ), mais pour un nombre d'octets plus élevé.
la source
Octave, 19 octets
Octave a deux fonctions pour convertir les nombres décimaux en nombres binaires.
dec2bin
convertit un nombre en une chaîne de caractères1
et0
(valeurs ASCII48
et49
). La longueur de la chaîne sera égale au nombre de bits nécessaire, sauf indication contraire. Étant donné que les caractères1
et ne0
sont pas nuls, nous pouvons utilisernnz
pour trouver le nombre d'éléments comme celui - ci:@(x)nnz(dec2bin(x))
. C'est 19 octets, donc c'est à égalité avec l'autre réponse Octave de Luis Mendo .Pouvons-nous mieux utiliser
de2bi
?de2bi
est une fonction qui renvoie les nombres binaires sous forme de vecteur avec les nombres1
et0
sous forme d’entiers, pas de caractères.de2bi
est évidemment deux octets plus court quedec2bin
, mais nous ne pouvons plus utilisernnz
. Nous pouvons utilisernnz
si nous ajoutons1
tous les éléments ou si nous en faisons un vecteur logique avec uniquement destrue
valeurs.@(x)nnz(de2bi(x)+1)
et@(x)nnz(de2bi(x)<2)
sont tous deux 19 octets. En utilisantnumel
également nous donner 19 octets,@(x)numel(de2bi(x))
.rows
est un octet plus court quenumel
, maisde2bi
renvoie un vecteur horizontal, il doit donc être transposé.@(x)rows(de2bi(x)')
Il se trouve qu’il s’agit également de 19 octets.la source
Pyke, 3 octets
Essayez-le ici!
la source
Retina ,
4423 octetsNécessite trop de mémoire pour pouvoir exécuter des valeurs d’entrée importantes. Convertit en unaire, puis divise à plusieurs reprises par 2, en comptant combien de fois jusqu'à atteindre zéro. Le nombre d'octets suppose un codage ISO 8859-1.
Essayez-le en ligne
la source