Câu hỏi Bạn đã bao giờ phải sử dụng bit dịch chuyển trong các dự án thực sự?


Bạn đã bao giờ phải sử dụng sự dịch chuyển bit trong các dự án lập trình thực sự? Hầu hết các ngôn ngữ cấp cao (nếu không phải tất cả) đều có các toán tử thay đổi trong chúng, nhưng khi nào bạn thực sự cần sử dụng chúng?


76


gốc




Các câu trả lời:


Tôi vẫn viết mã cho các hệ thống không có hỗ trợ dấu chấm động trong phần cứng. Trong các hệ thống này, bạn cần bit-shifting cho gần như tất cả số học của bạn.

Ngoài ra, bạn cần thay đổi để tạo băm. Số học đa thức (CRC, Reed-Solomon Codes là các ứng dụng chính) hoặc sử dụng ca làm việc.

Tuy nhiên, sự thay đổi chỉ được sử dụng bởi vì chúng tiện dụng và thể hiện chính xác những gì người viết dự định. Bạn có thể mô phỏng tất cả các thay đổi bit với phép nhân nếu bạn muốn, nhưng điều đó sẽ khó viết hơn, ít đọc được hơn và đôi khi chậm hơn.

Các trình biên dịch phát hiện các trường hợp mà phép nhân có thể được giảm xuống một ca.


49





Có, tôi đã sử dụng chúng rất nhiều lần. Bit twiddling là quan trọng trên phần cứng nhúng, nơi bit-mặt nạ là rất phổ biến. Nó cũng rất quan trọng trong việc lập trình trò chơi, khi bạn cần mọi hiệu suất cuối cùng.

Chỉnh sửa: Ngoài ra, tôi sử dụng chúng rất nhiều để thao tác bitmap, ví dụ như thay đổi độ sâu màu hoặc chuyển đổi RGB <-> BGR.


35



Thứ hai. Tôi làm rất nhiều chương trình nhúng, và bit chuyển là một hoạt động phổ biến. - e.James
Chuyển đổi RGB <-> BGR tại đây. - Neil N


  • Tạo các giá trị cờ đẹp cho các enums (thay vì gõ thủ công 1, 2, 4 ...)
  • Giải nén dữ liệu từ các trường bit (nhiều giao thức mạng sử dụng chúng)
  • -Sự đi ngang đường cong Z
  • Hiệu suất hack

Và tôi không thể nghĩ nhiều trường hợp khi chúng được sử dụng. Nó thường là cách khác xung quanh - có một số vấn đề cụ thể, và nó chỉ ra rằng sử dụng các hoạt động bit sẽ mang lại kết quả tốt nhất (thường là về thời gian thực hiện và / hoặc không gian).


24



Bạn có thể cần nó để lưu trữ ví dụ hai shorts trong một inttrường eger trong trạng thái phiên trong ASP.net mà không cần phải đọc và khóa phiên để đọc hai giá trị riêng biệt. Ngoài ra, phí lưu trữ bộ nhớ của việc lưu trữ hai giá trị trong phiên được lưu. - David d C e Freitas


Một nơi tôi sử dụng tất cả thời gian là khi chuyển đổi số cuối của số nguyên cho các ứng dụng đa nền tảng. Họ cũng đôi khi có ích (cùng với các nhà khai thác thao tác bit khác) khi đổ đồ họa 2D.


14



Thứ hai, viết một bộ chuyển đổi cho bộ ký tự EBCDIC. Thật không may, điều này thực sự là làm việc ở mức độ thấp trong một ngôn ngữ cấp cao, nhưng nó là cần thiết trong một số trường hợp. - Michael Meadows


Tôi đã sử dụng chúng một vài lần, nhưng khá nhiều luôn luôn cho phân tích cú pháp một định dạng tập tin nhị phân.


8





Bài viết hợp lý ở đây: http://greatjustice.info/the-lost-art-of-bitmasks/


6



liên kết đó hiện cung cấp 404 - Bryan Oakley
bạn vẫn có thể truy cập tại đây: web.archive.org/web/20090406021150/http://greatjustice.info/… - Software Guy


Tốc độ bit nhanh. Chúng được triển khai trong bộ lệnh CPU từ lâu trước khi hoạt động phân chia và mô đun được thực hiện. Nhiều người trong chúng ta đã sử dụng dịch chuyển bit cho số học đơn giản trên bút chì và giấy, nhưng không có sẵn trên các CPU của chúng tôi.

Ví dụ:

  • Tôi đã sử dụng thay đổi chút cho các dự án liên quan đến bao thanh toán lớn vật liệu tổng hợp vào các yếu tố chính của họ.
  • Tôi cũng đã sử dụng thay đổi bit cho tìm căn bậc hai và khối lập phương của số nguyên lớn tùy ý.

6



bạn có thể xin vui lòng gửi một ví dụ như thế nào bạn sử dụng nó để tìm khối lập phương hoặc căn bậc hai? Tôi là một chút không thấy làm thế nào điều này có thể được thực hiện. - Xsmael


Có, vẫn còn cần thiết.

Ở đây trong công việc của tôi ví dụ chúng tôi phát triển phần mềm cho comunication với PLC thông qua cổng COMx nối ​​tiếp. Nó cần thiết để xử lý các bit trong một byte, chúng tôi sử dụng các phép toán trái / phải và toán tử OR, XOR, AND theo từng ngày.

Ví dụ, giả sử chúng ta cần bật bit 3 (phải sang trái) của một byte:

Nó hiệu quả hơn nhiều để làm:

Byte B;

B := B XOR 4;

Thay vì:

Byte B = 0;
String s;  // 0 based index

s = ConvertToBinary (B);
s[5] = "1";
B := ConvertToDecimal (s);

Trân trọng.


5



Bạn có thể muốn thêm lý do tại sao 4 liên quan đến bit 3 (từ phải sang trái) - HCP
Tại sao s [5]? Không phải là S [2] sao? - IamIC
B: = B XOR 4; Trong trường hợp này, để bật bit cụ thể, không nên chỉ là OR? Không phải XOR được sử dụng để chuyển đổi? stackoverflow.com/questions/47981/… - Hari