Những lợi thế của việc sử dụng các hoạt động bitwise là gì? [đóng cửa]


19

Sau khi đọc bản tin CodeProject mới nhất, tôi đã xem qua bài viết này về các hoạt động bitwise . Nó làm cho việc đọc thú vị và tôi chắc chắn có thể thấy lợi ích của việc kiểm tra xem một số nguyên là chẵn hay lẻ, nhưng kiểm tra xem bit thứ n có được đặt không? Điều gì có thể có thể là những lợi thế của điều này?

Câu trả lời:


27

Hoạt động bitwise là hoàn toàn cần thiết khi lập trình đăng ký phần cứng trong các hệ thống nhúng. Ví dụ, mọi bộ xử lý mà tôi đã từng sử dụng đều có một hoặc nhiều thanh ghi (thường là một địa chỉ bộ nhớ cụ thể) để kiểm soát xem một ngắt được bật hay tắt. Để cho phép ngắt để kích hoạt quy trình thông thường là đặt bit cho phép cho một loại ngắt đó trong khi, quan trọng nhất là không sửa đổi bất kỳ bit nào khác trong thanh ghi.

Khi ngắt xảy ra, nó thường đặt một bit trong thanh ghi trạng thái để một thói quen dịch vụ duy nhất có thể xác định lý do chính xác cho ngắt. Kiểm tra các bit riêng lẻ cho phép giải mã nhanh nguồn ngắt.

Trong nhiều hệ thống nhúng, tổng RAM có thể có thể là 64, 128 hoặc 256 BYTES (nghĩa là Byte không phải kilobyte hoặc megabyte) Trong môi trường này, người ta thường sử dụng một byte để lưu trữ nhiều mục dữ liệu, cờ boolean, v.v. để thiết lập và đọc chúng.

Tôi đã, trong một số năm làm việc với một hệ thống thông tin vệ tinh trong đó tải trọng tin nhắn là 10,5 byte. Để sử dụng tốt nhất gói dữ liệu này, thông tin phải được đóng gói vào khối dữ liệu mà không để lại bất kỳ bit không sử dụng nào giữa các trường. Điều này có nghĩa là sử dụng rộng rãi các toán tử bit và shift để lấy các giá trị thông tin và đóng gói chúng vào tải trọng được truyền đi.


4
Đối với những người quan tâm đến các hoạt động và tối ưu hóa bit boolean nhiều hơn, hãy xem Delight Delight: amazon.com/Hackers-Delight-Henry-S-Warren/dp/0201914654
gablin

7

Về cơ bản, bạn sử dụng chúng do cân nhắc kích thước và tốc độ. Các phép toán bitwise cực kỳ đơn giản và do đó thường nhanh hơn các phép toán số học. Ví dụ, để có được phần màu xanh lục của giá trị rgb, phương pháp số học là (rgb / 256) % 256. Với các thao tác bitwise bạn sẽ làm một cái gì đó như (rgb >> 8) & 0xFF. Cái sau nhanh hơn đáng kể và một khi bạn đã quen với nó, nó cũng dễ dàng hơn. Nói chung, các thao tác bitwise hoạt động rất nhiều khi bạn cần mã hóa / giải mã dữ liệu một cách gọn nhẹ và nhanh chóng.


2
BYTE g1 = (rgb / 256) % 256; 00E51013...C1 E9 08...shr ecx,8 00E51016...88 0C 24...mov byte ptr [esp],cl
rwong

4

Những loại hoạt động này thường được sử dụng khi viết cho các hệ thống nhúng, nơi bộ nhớ hoặc sức mạnh CPU bị hạn chế.

Ví dụ, để tiết kiệm không gian, bạn có thể lưu trữ nhiều biến trong một biến int 8 bit duy nhất bằng cách sử dụng mỗi bit để biểu diễn một boolean. Sau đó, bạn cần một cách nhanh chóng để thiết lập một bit cụ thể hoặc lấy giá trị bit.

Nói chung khi lập trình bằng các ngôn ngữ cấp cao hơn như C # trên máy tính để bàn có bộ nhớ Gigabyte, bạn không thực sự quan tâm rằng mỗi ngôn ngữ bool chiếm toàn bộ một byte . Nhưng nếu bạn đang lập trình một vi điều khiển trong C với 2kb bộ nhớ, thì mỗi bit sẽ được tính, do đó khả năng đóng gói 8 bool vào một byte đơn có thể rất quan trọng.


.NET có [Flags]thuộc tính cho phép sử dụng một Enumtrường bit. Chẳng hạn, Fontcó một thuộc Styletính là một trường bit chứa đậm, in nghiêng, gạch chân và gạch ngang.
deltreme

@deltternal. Vâng tôi biết bạn có thể sử dụng [Cờ], nhưng đó không phải là vấn đề. Vấn đề là ở các ngôn ngữ cấp cao, bạn không quan tâm nhiều đến việc sử dụng một vài byte dung lượng cho một vài bool. Bạn thường quan tâm nhiều hơn về khả năng bảo trì và khả năng đọc mã. Trong các hệ thống nhúng mà bạn quan tâm về kích thước, bạn không có quyền truy cập vào những thứ như thuộc tính .net [Flags], vì vậy đó là nơi bạn có thể sử dụng các thao tác bitwise này.
Simon P Stevens

"nhưng kiểm tra nếu bit thứ n được đặt? Điều gì có thể là lợi thế của việc này?" vì vậy đó là vấn đề - nhưng vì không có ngôn ngữ nào được chỉ định, tôi quyết định nhập nó dưới dạng nhận xét về câu trả lời trong đó C # đã được đề cập. Đây không phải là một nhận xét về câu trả lời của bạn, đó là một bổ sung, hoặc những điều tốt đẹp để biết hoặc bất cứ điều gì.
deltreme

@deltternal: Ồ, tuyệt.
Simon P Stevens

3

Các thao tác bitwise cũng được sử dụng thường xuyên trong các codec video và âm thanh, với cùng lý do như trong các thiết bị điện tử nhúng; có thể đóng gói năm cờ và bộ đếm thời gian mười một bit thành một nửa int rất hữu ích khi bạn muốn tạo một codec video siêu hiệu quả.

Trên thực tế, MPEG 4 thậm chí còn sử dụng mã hóa Golomb theo cấp số nhân cho các trường có độ dài bit thay đổi. Giá trị rộng 17 hoặc 19 bit của gói cuối cùng có thể chỉ rộng ba hoặc năm bit gói này - và bạn sẽ tìm ra tất cả những điều đó với các thao tác bitwise.


2

Thủ thuật kết hợp các hoạt động logic bitwise, hoạt động dịch chuyển bit và hoạt động số học có thể được hiểu bởi những người đã nghiên cứu xây dựng một bộ cộng nhị phân bằng cách sử dụng cổng logic (và, không,). Bên ngoài vòng tròn đó, rất khó hiểu nếu không có bình luận chi tiết.

Nó rất hữu ích khi lập trình các đơn vị SIMD , đặc biệt nếu kiến ​​trúc của CPU cố tình bỏ qua một số hướng dẫn SIMD vì chúng có thể được mô phỏng bởi một vài người khác.

Ví dụ, kiến ​​trúc có thể không xác định bất kỳ hướng dẫn nào để lấy các giá trị âm của một nhóm 16 byte, nhưng có thể được mô phỏng bằng cách phủ định bit và sau đó thêm 1. Tương tự, phép trừ cũng có thể được bỏ qua, bởi vì nó có thể được mô phỏng bằng cách lấy âm của toán hạng thứ hai. Tính khả dụng của "tuyến đường thay thế" là lý do bỏ qua các hướng dẫn nhất định.

Tương tự, SIMD chỉ có thể hỗ trợ bổ sung 8 bit song song, mà không thực hiện bổ sung cho các phần tử rộng hơn như 16 bit, 32 bit hoặc 64 bit. Để mô phỏng chúng, người ta cần trích xuất bit dấu từ kết quả tính toán 8 bit, sau đó thực hiện thao tác mang theo trên phần tử tiếp theo.


0

Đóng gói dữ liệu, ops nhanh hơn (nhân, chia và mô đun nhanh hơn đáng kể nếu được căn chỉnh theo lũy thừa 2), lật bit, v.v. Tìm hiểu chúng và bắt đầu sử dụng chúng và bạn sẽ dần dần bắt đầu thấy hầu hết các lợi thế của mình.


1
Đó là một câu trả lời khá trực giao.
itbruce
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.