Tôi nghĩ rằng phần thứ hai của câu hỏi:
Ngoài ra, các toán tử bitwise thực sự được sử dụng để làm gì? Tôi đánh giá cao một số ví dụ.
Chỉ được giải quyết một phần. Đây là hai xu của tôi về vấn đề đó.
Các phép toán bit trong ngôn ngữ lập trình đóng vai trò cơ bản khi xử lý nhiều ứng dụng. Hầu hết tất cả các tính toán cấp thấp phải được thực hiện bằng cách sử dụng loại hoạt động này.
Trong tất cả các ứng dụng cần gửi dữ liệu giữa hai nút, chẳng hạn như:
Trong lớp giao tiếp cấp thấp hơn, dữ liệu thường được gửi trong cái được gọi là khung . Khung chỉ là các chuỗi byte được gửi qua một kênh vật lý. Các khung này thường chứa dữ liệu thực tế cộng với một số trường khác (được mã hóa theo byte) là một phần của cái được gọi là tiêu đề . Tiêu đề thường chứa các byte mã hóa một số thông tin liên quan đến trạng thái của giao tiếp (ví dụ: với cờ (bit)), bộ đếm khung, mã sửa và phát hiện lỗi, v.v. Để lấy dữ liệu được truyền trong khung và xây dựng khung để gửi dữ liệu, bạn sẽ cần các thao tác bitwise chắc chắn.
Nói chung, khi xử lý loại ứng dụng đó, một API có sẵn để bạn không phải xử lý tất cả các chi tiết đó. Ví dụ: tất cả các ngôn ngữ lập trình hiện đại đều cung cấp thư viện cho các kết nối socket, vì vậy bạn không thực sự cần phải xây dựng các khung giao tiếp TCP / IP. Nhưng hãy nghĩ về những người giỏi đã lập trình các API đó cho bạn, họ chắc chắn phải xử lý việc xây dựng khung; sử dụng tất cả các loại thao tác bitwise để đi qua lại từ giao tiếp cấp thấp đến cấp cao hơn.
Như một ví dụ cụ thể, hãy tưởng tượng một số người cung cấp cho bạn một tệp chứa dữ liệu thô được phần cứng viễn thông ghi lại trực tiếp. Trong trường hợp này, để tìm các khung, bạn sẽ cần đọc các byte thô trong tệp và cố gắng tìm một số loại từ đồng bộ hóa, bằng cách quét dữ liệu từng bit. Sau khi xác định các từ đồng bộ hóa, bạn sẽ cần lấy các khung thực tế và CHIA SẺ chúng nếu cần (và đó mới chỉ là phần bắt đầu của câu chuyện) để lấy dữ liệu thực tế đang được truyền đi.
Một họ ứng dụng cấp thấp khác rất khác là khi bạn cần điều khiển phần cứng bằng một số cổng (loại cổ), chẳng hạn như cổng song song và nối tiếp. Các cổng này được điều khiển bằng cách đặt một số byte và mỗi bit trong số byte đó có một ý nghĩa cụ thể, về mặt hướng dẫn, cho cổng đó (ví dụ: xem http://en.wikipedia.org/wiki/Parallel_port ). Nếu bạn muốn xây dựng phần mềm thực hiện điều gì đó với phần cứng đó, bạn sẽ cần các thao tác bitwise để dịch các hướng dẫn bạn muốn thực hiện sang các byte mà cổng hiểu được.
Ví dụ: nếu bạn có một số nút vật lý được kết nối với cổng song song để điều khiển một số thiết bị khác, đây là dòng mã mà bạn có thể tìm thấy trong ứng dụng mềm:
read = ((read ^ 0x80) >> 4) & 0x0f;
Hy vọng điều này đóng góp.