Seberapa sulitkah operator bitwise untuk menafsirkan?
Saya memprogram sistem tertanam. Saya sudah banyak berlatih hal ini. Pertanyaan Anda yang ditautkan tentang peta hash dengan kode
static int hash(int h) {
// This function ensures that hashCodes that differ only by
// constant multiples at each bit position have a bounded
// number of collisions (approximately 8 at default load factor).
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
masuk akal bagi saya di sekitar selama diperlukan untuk mendikte kode dengan keras. Peristiwa yang dijelaskan dalam bitCount
segera jelas, tetapi butuh satu menit untuk mencari tahu mengapa itu benar-benar menghitung bit. Komentar akan sangat bagus, dan akan membuat pemahaman apa yang dilakukan kode hanya sedikit lebih keras daripada masalah hash.
Penting untuk membuat perbedaan antara membaca dan memahami kode. Saya dapat menafsirkan bitCount
kode, dan membacakan apa yang dilakukannya, tetapi membuktikan mengapa ia bekerja atau bahkan yang berfungsi akan membutuhkan waktu sebentar. Ada perbedaan antara bisa membaca kode dengan lancar dan bisa mengerti mengapa kodenya seperti itu. Beberapa algoritma cukup sulit. The apa dari hash
kode masuk akal, tapi komentar menjelaskan mengapa apa yang sedang dilakukan. Jangan berkecil hati jika fungsi menggunakan operator bitwise sulit dimengerti, mereka sering digunakan untuk melakukan hal-hal matematika yang rumit yang akan sulit terlepas dari formatnya.
Sebuah analogi
Saya sudah terbiasa dengan hal ini. Satu hal yang saya tidak terbiasa adalah regex. Saya kadang-kadang berurusan dengan mereka dalam membangun skrip, tetapi tidak pernah dalam pekerjaan pengembangan sehari-hari.
Saya tahu cara menggunakan elemen regex berikut:
[]
kelas karakter
- The
*
, .
dan +
wildcard
- Mulai dari string
^
dan akhir string$
- Kelas karakter \ d, \ w, dan
- Bendera / g
Ini cukup untuk membuat pertanyaan sederhana, dan banyak dari pertanyaan yang saya lihat tidak menyimpang jauh dari ini.
Apa pun yang tidak ada dalam daftar ini, saya meraih lembar contekan. Apa pun, kecuali {}
dan ()
- Lembar contekan tidak akan cukup. Saya tahu cukup banyak tentang orang-orang ini untuk mengetahui bahwa saya akan membutuhkan papan tulis, manual referensi, dan mungkin rekan kerja. Anda dapat mengemas beberapa algoritma gila ke dalam beberapa baris pendek regex.
Untuk merancang regex yang membutuhkan atau menyarankan apa pun yang tidak ada dalam daftar elemen yang diketahui, saya akan mencantumkan semua kelas input yang saya harapkan untuk dikenali dan memasukkannya ke dalam test suite. Saya akan membuat regex secara perlahan dan bertahap, dengan banyak langkah yang terputus-putus, dan melakukan langkah-langkah ini untuk mengendalikan sumber dan / atau meninggalkannya dalam komentar sehingga saya bisa mengerti apa yang seharusnya terjadi nanti ketika rusak. Jika ada dalam kode produksi, saya akan memastikan bahwa kode tersebut ditinjau oleh seseorang yang lebih berpengalaman.
Apakah ini tempat Anda bersama operator bitwise?
Jadi, Anda ingin berpengetahuan luas?
Menurut perkiraan saya, jika Anda dapat menafsirkan kode seperti apa yang dilakukan dengan menarik selembar kertas atau pergi ke papan tulis dan menjalankan operasi secara manual, Anda memenuhi syarat sebagai berpengetahuan luas. Untuk memenuhi syarat sebagai programmer yang berpengetahuan luas di bidang operasi bitwise Anda harus dapat melakukan empat hal:
Dapat membaca dan menulis operasi umum dengan lancar
Untuk programmer aplikasi, operasi umum dengan operator bitwise mencakup operator dasar |
dan &
untuk mengatur dan menghapus tanda. Ini seharusnya mudah. Anda harus dapat membaca dan menulis hal-hal seperti
open('file', O_WRONLY | O_APPEND | O_CREAT );
// Use an OR operator ^ here and ^ here to set multiple flags
tanpa melambat (dengan asumsi Anda tahu apa artinya bendera ).
Mampu membaca operasi yang lebih kompleks dengan beberapa pekerjaan
Menghitung bit sangat cepat dalam waktu O (log (n)) tanpa cabang, memastikan bahwa jumlah tabrakan dalam kode hash dapat berbeda dengan jumlah yang dibatasi, dan menguraikan alamat email , nomor telepon , atau HTML dengan regex adalah masalah yang sulit. Adalah masuk akal bagi siapa saja yang bukan ahli dalam bidang ini untuk meraih papan tulis, tidak masuk akal untuk tidak dapat mulai bekerja untuk memahami.
Mampu menulis beberapa algoritma kompleks dengan banyak pekerjaan.
Jika Anda bukan seorang ahli, Anda seharusnya tidak dapat melakukan hal-hal yang kompleks dan sulit. Namun, seorang programmer yang baik harus dapat menyelesaikannya dengan bekerja terus menerus. Lakukan ini cukup, dan Anda akan segera menjadi ahli :)