Para qualquer número inteiro positivo de 32 bits ( 1 ≤ n ≤ 0xFFFFFFFF
), o número de bits necessário para representar esse número inteiro.
Casos de teste
| 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
Então f(16)
, imprimiria ou retornaria5
Isso é código-golfe . O menor código em bytes ganha
floor(log2(num))+1
num
há uma potência de dois.Respostas:
05AB1E , 2 bytes
Experimente online!
fonte
bg
bg
.bg
no meio de jogosbad game
:)JavaScript (ES6), 18 bytes
fonte
n>>>1
para apoiarn > 0x7FFFFFFF
?>>
falhoun
nessa altura. Obrigado.f=(a,b=1)=>a>1?f(a>>1,++b):b
Montagem x86, 4 bytes
Assumindo constante em
EBX
:EAX contém o número de bits necessários para Constant.
Bytes:
☼¢├@
Hexadecimal:
['0xf', '0xbd', '0xc3', '0x40']
fonte
Python , 14 bytes
Experimente online!
fonte
bit_length
ébit_length()
.int.bit_length(n)
en.bit_length()
faça exatamente o mesmo.int.bit_length(n)
é uma chamada de função e, portanto, um trecho que assume que a entrada está armazenada em uma variável. Isso não é permitido por nossas regras, portanto, anexar(n)
tornaria esta resposta inválida. No entanto,int.bit_length
avalia uma função e pode ser salva em uma variável para uso posterior. Isso é permitido por padrão.Labirinto ,
1312 bytesExperimente online!
Explicação
O programa simplesmente divide repetidamente a entrada por 2 até que seja zero. O número de etapas é monitorado duplicando o valor em cada etapa. Depois de reduzido a zero, imprimimos a profundidade da pilha (menos 1).
O programa inicia no
?
qual lê a entrada. O loop principal é o bloco 2x2 abaixo, no sentido anti-horário:Quando o valor é zero após uma iteração completa, o bit linear no final é executado:
fonte
C, 31 bytes
... Então pensei em recursão. De obscuro para óbvio, e com um quarto do comprimento caiu.
Veja ao vivo em Coliru
C, 43 bytesChamar
f
com um valor não assinado (por exemplof(42u)
) "retornará" seu tamanho de bit. Até funciona0u
!Ungolfed e explicado: (barras invertidas omitidas)
Veja ao vivo em Coliru
fonte
n?...:0
não é necessário.#define f(n) ({64-__builtin_clzl(n);})
abordagem.Mathematica, 9 bytes
Alternativamente:
fonte
Perl 6 , 7 bytes
Tente
Explicação:
*
torna-o um lambda WhateverCode e indica onde colocar a entrada.msb
em um Int retorna o índice do bit mais significativo (baseado em 0)+1
é combinado no lambda e adiciona um ao resultado final da chamada.msb
.fonte
Macro do pré-processador C (com extensões gcc), 26
Usa o built -in-zeros da contagem do GCC .
Chame isso como uma função, por exemplo
f(100)
.Experimente online .
fonte
Retina ,
5637 bytesEsta solução funciona com todos os valores de entrada necessários.
O maior problema que Retina enfrenta nesse desafio é o fato de suas seqüências terem um comprimento máximo de 2 ^ 30 caracteres, portanto, a maneira usual de lidar com números (representação unária) não funciona com valores maiores que 2 ^ 30.
Para resolver esse problema, adotei uma abordagem diferente, mantendo uma espécie de representação decimal dos números, mas onde cada dígito é escrito em unário (chamarei essa representação de digitunário ). Por exemplo, o número
341
seria escrito como111#1111#1#
num dígito. Com essa representação, agora podemos trabalhar com números de até2^30/10
dígitos (~ cem milhões de dígitos). É menos prático que o padrão unário para aritmética arbitrária, mas com um pouco de esforço, poderíamos realizar qualquer tipo de operação.O algoritmo que usei faz divisões inteiras sucessivas por dois até chegarmos a zero, o número de divisões que criamos é o número de bits necessários para representar esse número.
Então, como é que vamos dividir por dois em dois dígitos? Aqui está o trecho de Retina que faz isso:
Essa substituição é suficiente para dividir um número digitunário por 2; basta remover 0,5s possíveis do final, se o número original for ímpar.
Então, aqui está o código completo, continuamos dividindo por dois até que ainda haja dígitos no número e colocamos um literal
n
na frente da string a cada iteração: o número den
no final é o resultado.Experimente online!
Solução atualizada, 37 bytes
Grande refatoração com muitas boas idéias que jogaram cerca de um terço do comprimento, tudo graças a Martin Ender!
A idéia principal é usar
_
como símbolo unário: dessa maneira, podemos usar dígitos regulares em nossa string, desde que os convertamos de volta para_
s quando necessário: isso permite salvar muitos bytes na divisão e na inserção de múltiplos dígitos.Aqui está o código:
Experimente online!
fonte
Ruby,
1916 bytesObrigado Jordan por jogar fora 3 bytes
fonte
%
:->n{("%b"%n).size}
.->n{"%b"%n=~/$/}
.Jolf, 2 bytes
Basta converter em binário e, em seguida, encontre o comprimento.
fonte
Julia 0.4 , 14 bytes
Experimente online!
fonte
JavaScript ES6, 19 bytes
Math.clz32
retorna o número de zero bits à esquerda na representação binária de 32 bits de um número. Então, para obter a quantidade de bits necessária, tudo o que precisamos fazer é subtrair esse número de 32fonte
a=>1+Math.log2(a)|0
também é 19 bytes.1+...|0
grita menos til !a=>-~Math.log2(a)
é 18ferramentas bash / Unix, 16 bytes
Salve isso em um script e passe a entrada como argumento. O número de bits necessários para representar esse número em binário será impresso.
Aqui está uma explicação:
dc é uma calculadora baseada em pilha. Sua entrada, analisada em tokens, é:
2 - Pressione 2 na pilha.
o - Retire um valor da pilha (que é 2) e torne-o a base de saída (para que a saída agora seja binária).
O valor do argumento para o programa bash ($ 1) - Empurre esse argumento na pilha.
n - Retire um valor da pilha (que é o número de entrada) e imprima-o (em binário, porque essa é a base de saída) sem nova linha final.
Portanto, o comando dc imprime o número em binário.
A saída de dc é canalizada para o comando wc com a opção -c, que imprime o número de caracteres em sua entrada.
O resultado final é imprimir o número de dígitos na representação binária do argumento.
fonte
Planilhas Google, 15 bytes
Leva a entrada da célula
A1
e sai para a célula que contém a fórmulaou
ou
Excel, 17 bytes
O mesmo que acima, mas formatado para o MS Excel
ou
ou
fonte
Pitão, 3 bytes
Conjunto de testes disponível aqui.
Explicação
fonte
hsl
ou.El
, no quall
calcula a base de log 2 ehs
ou.E
calcula o teto.Geléia, 2 bytes
Converte em binário, encontra comprimento.
fonte
C #,
634531 bytesEconomizou 18 bytes, graças a Loovjo e TuukkaX
Economizou 14 bytes, graças ao Grax
Ele usa que um número decimal n tem ⌊log2 (n) ⌋ + 1 bits, descrito nesta página:
fonte
...)+ 1)...
->...)+1...
. Além disso, acho que você pode retornar o valor diretamente em vez de imprimi-lo.b=>1+(int)System.Math.Log(b,2);
A conversão int fornece a mesma saída que Math.Floor e você não precisa da instrução using se fizer referência apenas ao sistema uma vez.C #, 32 bytes
Converte o parâmetro em uma string binária e retorna o comprimento da string.
fonte
Haskell, 20 bytes
Compõe uma função que usa o logaritmo base 2, pisos e adiciona 1.
fonte
Befunge-93 ,
2321 bytesBefunge é uma linguagem baseada em grade 2D (embora eu esteja usando apenas uma linha).
Experimente online!
fonte
Água-viva , 4 bytes
Experimente online!
Print (
p
), o comprimento (#
) da representação binária (b
) da entrada (i
).fonte
CJam , 5 bytes
Experimente online!
Leia input (
r
), converta para número inteiro (i
), obtenha representação binária (2b
), obtenha comprimento (,
).fonte
Oitava , 19 bytes
Função anônima que adiciona 1, calcula o logaritmo binário e arredonda para cima.
Experimente online!
fonte
QBIC , 18 bytes
Mike incrível! Mas como isso funciona?
fonte
Java 8,
3427 bytesPela primeira vez, o Java tem alguns recursos úteis! Agora, só precisamos de nomes mais curtos ...
Experimente online!
Obviamente, você pode fazer isso sem os recursos internos ( consulte a resposta do Snowman ), mas para obter uma contagem maior de bytes.
fonte
Oitava, 19 bytes
Oitava tem duas funções para converter números decimais em números binários.
dec2bin
converte um número em uma sequência de caracteres1
e0
(valores ASCII48
e49
). O comprimento da string será igual ao número necessário de bits, a menos que especificado de outra forma. Uma vez que os caracteres1
e0
são diferentes de zero, podemos usarnnz
para encontrar o número de elementos como este:@(x)nnz(dec2bin(x))
. São 19 bytes, por isso está relacionado à outra resposta oitava de Luis Mendo .Podemos fazer melhor usando
de2bi
?de2bi
é uma função que retorna os números binários como um vetor com os números1
e0
como números inteiros, não caracteres.de2bi
é obviamente dois bytes menor quedec2bin
, mas não podemos mais usarnnz
. Nós podemos usarnnz
se quer adicionar1
a todos os elementos, ou torna-lo em um vetor lógico com apenastrue
valores.@(x)nnz(de2bi(x)+1)
e@(x)nnz(de2bi(x)<2)
são ambos 19 bytes. Usarnumel
também nos dará 19 bytes@(x)numel(de2bi(x))
,.rows
é um byte menor quenumel
, masde2bi
retorna um vetor horizontal; portanto, ele deve ser transposto.@(x)rows(de2bi(x)')
acontece que também tem 19 bytes.fonte
Pyke, 3 bytes
Experimente aqui!
fonte
Retina ,
4423 bytesRequer muita memória para executar para grandes valores de entrada. Converte em unário, depois divide repetidamente por 2, contando quantas vezes até atingir zero. A contagem de bytes assume a codificação ISO 8859-1.
Experimente online
fonte