Tôi cần thực hiện một số bộ phận số nguyên trong đường dẫn nóng của mã. Tôi đã được xác định thông qua hồ sơ và chu kỳ đếm rằng các bộ phận nguyên đang chi phí cho tôi. Tôi hy vọng có điều gì đó tôi có thể làm để tăng sức mạnh cho các bộ phận thành một thứ rẻ hơn.Làm cách nào để tôi có thể giảm phân chia theo 2^n + 1?
Trong đường dẫn này, tôi chia cho 2^n + 1, trong đó n là biến. Về cơ bản, tôi muốn tối ưu hóa chức năng này để loại bỏ toán tử phân chia:
unsigned long compute(unsigned long a, unsigned int n)
{
return a/((1 << n) + 1);
}
Nếu tôi chia cho 2^n, tôi chỉ thay thế div bằng shift phải bằng n. Nếu tôi được chia cho một hằng số, tôi sẽ để sức mạnh trình biên dịch giảm phân chia cụ thể đó, có khả năng biến nó thành một số nhân và một số thay đổi.
Có tối ưu hóa tương tự áp dụng cho 2^n + 1 không?
Chỉnh sửa: đây có thể là số nguyên 64 bit tùy ý. n chỉ mất một vài giá trị giữa 10 và, ví dụ, 25. Tôi chắc chắn có thể tính toán trước một số giá trị cho mỗi n, nhưng không phải cho a.
Có bất kỳ hạn chế về các giá trị của a và n? –
Ngữ cảnh mà bạn đang gọi hàm là gì? – GManNickG
'return a/lookup [n];' –