Untuk setiap bilangan bulat 32-bit positif ( 1 ≤ n ≤ 0xFFFFFFFF
) menghasilkan jumlah bit yang diperlukan untuk mewakili bilangan bulat itu.
Uji kasus
| 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
Jadi f(16)
akan mencetak atau kembali5
Ini adalah kode-golf . Kode terpendek dalam byte menang
floor(log2(num))+1
num
kekuatan dua.Jawaban:
05AB1E , 2 byte
Cobalah online!
sumber
bg
bg
.bg
dalam game berartibad game
:)JavaScript (ES6), 18 byte
sumber
n>>>1
untuk mendukungn > 0x7FFFFFFF
?>>
gagal padan
setinggi itu. Terima kasih.f=(a,b=1)=>a>1?f(a>>1,++b):b
x86 Assembly, 4 byte
Dengan asumsi Constant dalam
EBX
:EAX berisi jumlah bit yang diperlukan untuk Constant.
Bytes:
☼¢├@
Heksadesimal:
['0xf', '0xbd', '0xc3', '0x40']
sumber
Python , 14 byte
Cobalah online!
sumber
bit_length
adalahbit_length()
.int.bit_length(n)
dann.bit_length()
lakukan hal yang persis sama.int.bit_length(n)
adalah panggilan fungsi , dan dengan demikian potongan yang mengasumsikan input disimpan dalam variabel. Ini tidak diizinkan oleh aturan kami, jadi menambahkan(n)
akan membuat jawaban ini tidak valid. Namun,int.bit_length
mengevaluasi ke suatu fungsi dan dapat disimpan dalam variabel untuk digunakan nanti. Ini diizinkan secara default.Labirin ,
1312 byteCobalah online!
Penjelasan
Program hanya berulang kali membagi input dengan 2 hingga nol. Jumlah langkah dilacak dengan menduplikasi nilai pada setiap langkah. Setelah dikurangi menjadi nol, kami mencetak kedalaman tumpukan (minus 1).
Program dimulai dari
?
yang membaca input. Loop utama kemudian blok 2x2 di bawah ini, berlawanan arah jarum jam:Setelah nilainya nol setelah iterasi penuh, bit linier pada akhirnya dijalankan:
sumber
C, 31 byte
... Lalu aku memikirkan rekursi. Dari yang tidak jelas menjadi jelas, dan dengan seperempat panjang jatuh.
Lihat langsung di Coliru
C, 43 byteMemanggil
f
dengan nilai yang tidak ditandatangani (mis.f(42u)
) Akan "mengembalikan" panjang bitnya. Bahkan berhasil0u
!Tidak diikat dan dijelaskan: (garis miring terbalik dihilangkan)
Lihat langsung di Coliru
sumber
n?...:0
tidak perlu.#define f(n) ({64-__builtin_clzl(n);})
pendekatan ini juga.Mathematica, 9 byte
Kalau tidak:
sumber
Perl 6 , 7 byte
Cobalah
Penjelasan:
*
membuatnya menjadi lambda WhateverCode, dan menunjukkan di mana harus memasukkan input.msb
pada Int mengembalikan indeks bit paling signifikan (berbasis 0)+1
digabungkan ke dalam lambda, dan menambahkan satu ke hasil panggilan akhirnya.msb
.sumber
C preprocessor macro (dengan ekstensi gcc), 26
Menggunakan hitungan-terkemuka-nol bawaan GCC .
Sebut ini sebagai fungsi, mis
f(100)
.Cobalah online .
sumber
Retina ,
5637 byteSolusi ini bekerja dengan semua nilai input yang diperlukan.
Masalah terbesar yang dihadapi Retina dalam tantangan ini adalah kenyataan bahwa string-nya memiliki panjang maksimum 2 ^ 30 karakter, jadi cara biasa menangani angka (representasi unary) tidak bekerja dengan nilai lebih besar dari 2 ^ 30.
Untuk mengatasi masalah ini saya mengadopsi pendekatan yang berbeda, menjaga semacam representasi angka desimal, tetapi di mana setiap digit ditulis dalam unary (Saya akan menyebut digitunary representasi ini ). Misalnya angka
341
akan ditulis111#1111#1#
dalam digitunary. Dengan representasi ini sekarang kita dapat bekerja dengan jumlah hingga2^30/10
digit (~ seratus juta digit). Ini kurang praktis daripada standar unary untuk aritmatika sewenang-wenang, tetapi dengan sedikit usaha kita bisa melakukan segala jenis operasi.Algoritma yang saya gunakan adalah membuat pembagian integer berturut-turut sebanyak dua hingga kita mencapai nol, jumlah divisi yang kami buat adalah jumlah bit yang diperlukan untuk mewakili angka ini.
Jadi, bagaimana kita membagi dua menjadi digitunary? Berikut cuplikan Retina yang melakukannya:
Penggantian ini cukup untuk membagi angka digital dengan 2, kita hanya perlu menghapus 0,5 mungkin dari akhir jika nomor aslinya ganjil.
Jadi, inilah kode lengkapnya, kita terus membaginya dengan dua sampai masih ada angka dalam bilangan, dan menempatkan literal
n
di depan string pada setiap iterasi: jumlahn
pada akhirnya adalah hasilnya.Cobalah online!
Solusi yang diperbarui, 37 byte
Refactoring besar dengan banyak ide bagus yang bermain golf sekitar sepertiga panjangnya, semua berkat Martin Ender!
Gagasan utamanya adalah untuk digunakan
_
sebagai simbol unary kita: dengan cara ini kita dapat menggunakan digit reguler dalam string kita, selama kita mengubahnya kembali menjadi_
s ketika diperlukan: ini memungkinkan kita menyimpan banyak byte pada pembagian dan penyisipan banyak digit.Ini kodenya:
Cobalah online!
sumber
Ruby,
1916 byteTerima kasih Jordan untuk bermain golf 3 byte
sumber
%
:->n{("%b"%n).size}
.->n{"%b"%n=~/$/}
.Jolf, 2 byte
Konversikan ke biner lalu temukan panjangnya.
sumber
Julia 0.4 , 14 byte
Cobalah online!
sumber
JavaScript ES6, 19 byte
Math.clz32
mengembalikan jumlah bit nol terkemuka dalam representasi biner 32-bit dari suatu angka. Jadi untuk mendapatkan jumlah bit yang dibutuhkan, yang perlu kita lakukan adalah mengurangi jumlah itu dari 32sumber
a=>1+Math.log2(a)|0
juga 19 byte.1+...|0
menjerit minus tilde !a=>-~Math.log2(a)
adalah 18bash / alat Unix, 16 byte
Simpan ini dalam skrip, dan berikan input sebagai argumen. Jumlah bit yang diperlukan untuk mewakili angka itu dalam biner akan dicetak.
Berikut penjelasannya:
dc adalah kalkulator berbasis tumpukan. Inputnya, diuraikan menjadi token, adalah:
2 - Tekan 2 pada tumpukan.
o - Pop nilai dari stack (yang 2) dan menjadikannya basis output (jadi output sekarang dalam biner).
Nilai argumen untuk program bash ($ 1) - Dorong argumen itu di stack.
n - Pop nilai dari stack (yang merupakan nomor input) dan cetak (dalam biner, karena itulah basis output) tanpa baris baru.
Jadi perintah dc mencetak angka dalam biner.
Output dari dc disalurkan ke perintah wc dengan opsi -c, yang mencetak jumlah karakter dalam inputnya.
Hasil akhirnya adalah mencetak jumlah digit dalam representasi biner dari argumen tersebut.
sumber
Google Sheets, 15 Bytes
Membawa input dari sel
A1
dan output ke sel yang menyimpan formulaatau
atau
Excel, 17 Bytes
Sama seperti di atas tetapi diformat untuk MS Excel
atau
atau
sumber
Pyth, 3 byte
Test suite tersedia di sini.
Penjelasan
sumber
hsl
atau.El
, di manal
menghitung basis log 2, danhs
atau.E
menghitung plafon.Jelly, 2 byte
Mengubah ke biner, menemukan panjang.
sumber
C #,
634531 byteDisimpan 18 byte, terima kasih kepada Loovjo, dan TuukkaX
Disimpan 14 byte, terima kasih kepada Grax
Ia menggunakan, bahwa angka desimal n memiliki ⌊log2 (n) ⌋ + 1 bit, yang dijelaskan pada halaman ini :
sumber
...)+ 1)...
->...)+1...
. Juga, saya pikir Anda dapat mengembalikan nilai secara langsung daripada mencetaknya.b=>1+(int)System.Math.Log(b,2);
Konversi int menyediakan output yang sama dengan Math.Floor dan Anda tidak perlu pernyataan menggunakan jika Anda hanya mereferensikan Sistem sekali.C #, 32 byte
Mengubah parameter menjadi string biner dan mengembalikan panjang string.
sumber
Haskell, 20 byte
Menyusun fungsi yang mengambil basis logaritma 2, lantai, dan menambahkan 1.
sumber
Befunge-93 ,
2321 BytesBefunge adalah bahasa berbasis grid 2D (meskipun saya hanya menggunakan satu baris).
Cobalah online!
sumber
Ubur-ubur , 4 byte
Cobalah online!
Cetak (
p
), panjang (#
) dari representasi biner (b
) dari input (i
).sumber
CJam , 5 byte
Cobalah online!
Baca input (
r
), konversikan ke integer (i
), dapatkan representasi biner (2b
), dapatkan panjang (,
).sumber
Oktaf , 19 byte
Fungsi anonim yang menambahkan 1, menghitung logaritma biner dan mengumpulkan.
Cobalah online!
sumber
QBIC , 18 byte
Itu luar biasa Mike! Tetapi bagaimana cara kerjanya?
sumber
Java 8,
3427 byteUntuk sekali, Java memiliki beberapa builtin berguna! Sekarang, kita hanya perlu beberapa nama pendek ...
Cobalah online!
Tentu saja, Anda dapat melakukan ini tanpa builtin ( lihat jawaban Snowman ), tetapi untuk jumlah byte yang lebih tinggi.
sumber
Oktaf, 19 byte
Oktaf memiliki dua fungsi untuk mengubah angka desimal menjadi angka biner.
dec2bin
mengubah angka menjadi string karakter1
dan0
(nilai ASCII48
dan49
). Panjang string akan sama dengan jumlah bit yang diperlukan, kecuali ditentukan lain. Karena karakter1
dan0
non-nol, kita dapat menggunakannnz
untuk menemukan jumlah elemen seperti ini:@(x)nnz(dec2bin(x))
. Ini 19 byte, jadi ini terkait dengan jawaban Oktaf Luis Mendo lainnya .Bisakah kita menggunakan lebih baik
de2bi
?de2bi
adalah fungsi yang mengembalikan angka-angka biner sebagai vektor dengan angka-angka1
dan0
sebagai bilangan bulat, bukan karakter.de2bi
jelas dua byte lebih pendek daridec2bin
, tetapi kita tidak bisa lagi menggunakannnz
. Kita dapat menggunakannnz
jika kita menambahkan1
semua elemen, atau membuatnya menjadi vektor logis dengantrue
nilai saja .@(x)nnz(de2bi(x)+1)
dan@(x)nnz(de2bi(x)<2)
keduanya 19 byte. Menggunakannumel
juga akan memberi kita 19 byte@(x)numel(de2bi(x))
,.rows
adalah satu byte lebih pendek darinumel
, tetapide2bi
mengembalikan vektor horizontal, sehingga harus ditransposisi@(x)rows(de2bi(x)')
kebetulan 19 byte juga.sumber
Pyke, 3 byte
Coba di sini!
sumber
Retina ,
4423 byteMembutuhkan terlalu banyak memori untuk dijalankan untuk nilai input yang besar. Mengonversi menjadi unary, lalu berulang kali membaginya dengan 2, menghitung berapa kali hingga mencapai nol. Hitungan byte mengasumsikan penyandian ISO 8859-1.
Cobalah online
sumber