Làm thế nào khó là các nhà khai thác bitwise để giải thích?
Tôi lập trình các hệ thống nhúng. Tôi đã thực hành công cụ này rất nhiều. Câu hỏi được liên kết của bạn về bản đồ băm với mã
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);
}
có ý nghĩa hoàn hảo với tôi trong chừng nào sẽ mất để đọc chính tả mã. Các sự kiện được mô tả bitCount
ngay lập tức rõ ràng, nhưng phải mất một phút để tìm ra lý do tại sao nó thực sự đếm bit. Tuy nhiên, các bình luận sẽ rất tuyệt và sẽ giúp hiểu được những gì mã chỉ khó hơn một chút so với vấn đề băm.
Điều quan trọng là phân biệt giữa đọc và hiểu mã. Tôi có thể giải thích bitCount
mã, và đọc những gì nó làm, nhưng việc chứng minh tại sao nó hoạt động hoặc thậm chí nó hoạt động sẽ mất một phút. Có một sự khác biệt giữa việc có thể đọc mã trơn tru và có thể tìm hiểu lý do tại sao mã là như vậy. Một số thuật toán đơn giản là khó. Những gì của hash
mã có ý nghĩa, nhưng bình luận giải thích tại sao những gì đang được thực hiện. Đừng nản lòng nếu một hàm sử dụng các toán tử bitwise khó hiểu, chúng thường được sử dụng để thực hiện các công cụ toán học phức tạp, khó có thể định dạng được.
Một sự tương tự
Tôi đã quen với những thứ này. Một chủ đề mà tôi không quen là regex. Tôi thỉnh thoảng xử lý chúng trên các tập lệnh xây dựng, nhưng không bao giờ trong công việc phát triển hàng ngày.
Tôi biết cách sử dụng các yếu tố sau của regex:
[]
lớp nhân vật
- Các
*
, .
và +
ký tự đại diện
- Bắt đầu chuỗi
^
và kết thúc chuỗi$
- Các lớp ký tự \ d, \ w và \ s
- Cờ / g
Điều này là đủ để tạo các truy vấn đơn giản và nhiều truy vấn tôi thấy không đi xa khỏi điều này.
Bất cứ điều gì không có trong danh sách này, tôi với tới một bảng cheat. Bất cứ điều gì, đó là, ngoại trừ {}
và ()
- Bảng cheat sẽ không đủ. Tôi biết vừa đủ về những người này để biết rằng tôi sẽ cần một bảng trắng, sách hướng dẫn tham khảo và có thể là đồng nghiệp. Bạn có thể gói một số thuật toán điên rồ vào một vài dòng regex ngắn.
Để thiết kế một regex yêu cầu hoặc gợi ý bất cứ thứ gì không có trong danh sách các yếu tố đã biết của tôi, tôi sẽ liệt kê ra tất cả các lớp đầu vào mà tôi mong đợi nhận ra và đưa chúng vào bộ kiểm tra. Tôi sẽ tạo ra regex từ từ và tăng dần, với nhiều bước không liên tục và cam kết các bước này để kiểm soát nguồn và / hoặc để chúng trong một nhận xét để tôi có thể hiểu những gì sẽ xảy ra sau đó khi nó bị hỏng. Nếu nó nằm trong mã sản xuất, tôi sẽ đảm bảo rằng nó được xem xét bởi một người có nhiều kinh nghiệm hơn.
Đây có phải là nơi bạn đang ở với các toán tử bitwise?
Vì vậy, bạn muốn được tròn trịa?
Theo ước tính của tôi, nếu bạn có thể diễn giải mã như thế này bằng cách rút ra một mảnh giấy hoặc đi đến bảng trắng và chạy qua các thao tác bằng tay, bạn đủ điều kiện làm tròn. Để đủ điều kiện trở thành một lập trình viên giỏi toàn diện trong lĩnh vực hoạt động bitwise, bạn sẽ có thể thực hiện bốn điều:
Có thể đọc và viết các hoạt động chung
một cách trôi chảy Đối với một lập trình viên ứng dụng, các hoạt động chung với các toán tử bitwise bao gồm các toán tử cơ bản |
và &
để thiết lập và xóa các cờ. Điều này nên dễ dàng. Bạn sẽ có thể đọc và viết những thứ như
open('file', O_WRONLY | O_APPEND | O_CREAT );
// Use an OR operator ^ here and ^ here to set multiple flags
mà không làm chậm (giả sử bạn biết những lá cờ có nghĩa là gì ).
Có thể đọc các hoạt động phức tạp hơn với một số công việc
Đếm các bit rất nhanh trong thời gian O (log (n)) mà không cần các nhánh, đảm bảo rằng số lượng va chạm trong mã băm có thể khác nhau bởi một lượng giới hạn và phân tích địa chỉ email , số điện thoại hoặc HTML với một regex là những vấn đề khó khăn. Thật hợp lý cho bất cứ ai không phải là chuyên gia trong các lĩnh vực này tiếp cận với bảng trắng, thật vô lý khi không thể bắt đầu làm việc để hiểu.
Có thể viết một số thuật toán phức tạp với rất nhiều công việc
Nếu bạn không phải là chuyên gia, bạn không nên mong đợi có thể làm những việc phức tạp và khó khăn. Tuy nhiên, một lập trình viên giỏi sẽ có thể hoàn thành nó bằng cách làm việc liên tục. Làm điều này đủ, và bạn sẽ sớm trở thành một chuyên gia :)