Trình biên dịch sẽ triển khai nó theo cách hiệu quả nhất, miễn là bạn hiểu những gì bạn cần và yêu cầu trình biên dịch thực hiện chính xác điều đó. Nếu ca là cách hiệu quả nhất trong trường hợp này, trình biên dịch sẽ sử dụng ca.
Hãy nhớ rằng nếu bạn đang thực hiện đã ký chia (tức là pos
được ký), sau đó nó không thể được thực hiện hoàn toàn bởi một ca. Việc tự thay đổi sẽ tạo ra các kết quả không hợp lệ cho các giá trị âm của pos
. Nếu trình biên dịch quyết định sử dụng thay đổi cho các hoạt động này, nó cũng sẽ phải thực hiện một số sửa đổi sau ca trên kết quả trung gian để làm cho nó đồng ý với các yêu cầu của đặc tả ngôn ngữ.
Vì lý do này, nếu bạn đang thực sự tìm kiếm hiệu quả tối đa có thể có của hoạt động phân chia, bạn phải nhớ không sử dụng các loại đã ký một cách vô ý. Thích sử dụng các loại chưa ký bất cứ khi nào có thể và chỉ sử dụng các loại đã ký khi bạn cần.
P.S. AFAIK, Java thực hiện phân chia Euclide, có nghĩa là các nhận xét trên không áp dụng cho Java. Sự phân chia Euclide được thực hiện một cách chính xác bởi sự dịch chuyển trên một ước số âm trong biểu diễn bù 2. Các nhận xét trên sẽ áp dụng cho C/C++.
'pos/(2^6)' => 'pos >> 6'; 'pos/(2^1)' => 'pos >> 1' – irrelephant
Phân chia không nên tốn kém ở cấp cpu. – ceklock
Bạn có thể nhầm lẫn về "phân chia là tốn kém". Hãy nhớ trích dẫn nổi tiếng của Donald Knuth: [Tối ưu hóa sớm là gốc rễ của tất cả các Ác ma] (http://en.wikipedia.org/wiki/Program_optimization) – paulsm4