Về nửa đầu:
>>
là một sự thay đổi chút khôn ngoan bên phải.
Vì vậy, dịch chuyển giá trị số 3 bit sang phải cũng giống như chia cho 8 và int
nhập kết quả.
Dưới đây là một tài liệu tham khảo tốt cho các nhà khai thác và ưu tiên của họ: http://web.cs.mun.ca/~michael/c/op.html
Phần thứ hai của câu hỏi của bạn liên quan đến việc điều hành &
, đó là một chút khôn ngoan AND. Ví dụ là ANDing i
và một số để lại tất cả các bit được đặt trừ 3 bit ít quan trọng nhất. Đó là cơ bản cùng một điều xảy ra khi bạn có một số, chia cho 8, lưu trữ kết quả dưới dạng số nguyên, sau đó nhân kết quả đó với 8.
Lý do này chia cho 8 và lưu trữ dưới dạng số nguyên cũng giống như dịch chuyển bit tới đúng 3 vị trí, và nhân với 8 và lưu trữ kết quả trong một int là giống như dịch chuyển bit sang 3 vị trí bên trái. Vì vậy, nếu bạn đang nhân hoặc chia cho một sức mạnh của 2, chẳng hạn như 8, và bạn sẽ chấp nhận cắt ngắn các bit xảy ra khi bạn lưu trữ kết quả đó trong một int
, dịch chuyển bit nhanh hơn , hoạt động. Điều này là do bộ vi xử lý có thể bỏ qua thuật toán nhân/chia và chỉ cần chuyển thẳng sang các bit dịch chuyển, bao gồm vài bước.
Nguồn
2011-10-10 20:09:33
'i >> 3' là/chỉ có thể nhanh hơn' i/8' trên trình biên dịch * hoàn toàn khủng khiếp * khi tối ưu hóa. Đừng lo lắng về nó - viết mã rõ ràng hơn ;-) –
Bất cứ ai nói với bạn rằng có lẽ vẫn còn sống trong * ngày vinh quang * của văn bản lắp ráp. Chuyển đổi những thứ như 'i/8' sang' i >> 3' được gọi là [giảm cường độ] (https://secure.wikimedia.org/wikipedia/en/wiki/Strength_reduction) và là một trong những tối ưu hóa cơ bản nhất được thực hiện bởi trình biên dịch. – Praetorian