Saya mencoba menggunakan C # untuk menemukan indeks 1 pertama (kanan ke kiri) dalam representasi biner angka. Misalnya, karena 100 dalam biner adalah:
0b1100100
1 pertama ada di posisi ketiga dari kanan, jadi harus menghasilkan 3.
234 harus menghasilkan 2, 0 harus menghasilkan 0, dll.
Inilah solusi saya saat ini:
k < 1 ? 0 :(int)Math.Log(k & -k, 2) + 1;
Adakah cara saya bisa membuat ini lebih pendek?
Convert.ToString(k,2).IndexOf("1")
adalah apa yang Anda inginkan, atau sesuatu yang serupa, situs yang salah.Jawaban:
Jika hanya C # mendukung intrinsik khusus-mesin… Ada satu instruksi yang dapat melakukan ini dalam bahasa assembly x86, dan pada sebagian besar arsitektur prosesor lainnya juga. Maka Anda tidak hanya memiliki kode terpendek, tetapi sangat mungkin tercepat.
Sebenarnya, membuat kode ini lebih pendek adalah masalah yang sangat membosankan dibandingkan dengan membuat kode ini cepat . Ada segala macam solusi yang benar-benar rapi, efisien, sedikit membingungkan, dan Anda juga bisa mempertimbangkan menggunakan tabel pencarian.
Tidak ada yang penting untuk bermain golf. Menurut saya solusi Anda saat ini adalah yang terbaik yang dapat Anda lakukan. Tentu saja, Anda dapat menghapus spasi putih berlebihan:
Saya pribadi akan menuliskannya sebagai:
karena saya pikir itu sedikit lebih jelas untuk memiliki arah tes bersyarat seperti itu, serta membandingkannya dengan nol, tapi saya kira itu enam satu arah, setengah lusin lainnya.
C # tidak mendukung konversi implisit dari
int
kebool
seperti C dan C ++ lakukan, sehingga Anda tidak bisa benar-benar mempersingkat uji kondisional lebih jauh.Anda juga terjebak dengan pemeran eksplisit dari
double
(seperti mengembalikan sayaMath.Log
) keint
, karena C # tidak akan membiarkan ini terjadi secara implisit. Tentu saja, itu biasanya hal yang baik karena itu akan menunjukkan bahwa Anda memiliki masalah kinerja besar di sini: mempromosikanint
kedouble
, menghitung log daridouble
, dan kemudian mengonversidouble
hasilnya kembali keint
akan menjadi sangat lambat, jadi biasanya sesuatu yang ingin Anda hindari. Tapi ini adalah jenis penyimpangan yang harus Anda lakukan ketika bermain golf kode.Saya awalnya datang dengan
(Tidak diserang untuk kejelasan, tentu saja), yang menghindari pengambilan logaritma dan karena itu merupakan peningkatan dalam ukuran dan kecepatan kode. Sayangnya, ini tidak selalu mendapatkan jawaban yang benar, dan saya menganggap itu merupakan persyaratan yang tidak fleksibel. :-) Secara khusus, gagal jika nilai input (
k
) adalah faktor 8. Ini dapat diperbaiki, tetapi bukan tanpa membuat kode lebih lama dariMath.Log
versi.sumber
Math
harus sepenuhnya memenuhi syarat sehingga versi Anda yang lain harus lebih baik walaupun saya belum benar-benar menghitung byte.System.
maka itu harus lebih pendek dan benar.