Trong tối ưu hóa mã máy, phép nhân/chia cho lũy thừa của 2 có thể được thay bằng phép dịch bit (shift) vốn rẻ hơn nhiều so với phép nhân/chia thực sự, vì a×2k=a≪k, và với a≥0 thì ⌊a/2k⌋=a≫k.
Cho n lệnh mã ba địa chỉ dạng x = a op b với op∈{+,−,∗,/}, trong đó a,b mỗi cái là một hằng số nguyên không âm hoặc tên biến. Với mỗi lệnh, hãy áp dụng đúng một quy tắc đầu tiên khớp trong danh sách theo thứ tự ưu tiên sau:
* và đúng một trong hai toán hạng là hằng số bằng 2k (k≥1) còn toán hạng kia là biến (không phải hằng số) → thay bằng x = <biến> << k./ và b là hằng số bằng 2k (k≥1) còn a là biến (không phải hằng số) → thay bằng x = <biến> >> k (giả thiết biến đó luôn không âm lúc chạy).Lưu ý quan trọng: 20=1 không được coi là lũy thừa của 2 hợp lệ cho quy tắc này (tức k phải ≥1); nếu cả hai toán hạng đều là hằng số, hoặc toán tử là +/-, lệnh luôn giữ nguyên.
Ví dụ: x = 4 * y → x = y << 2 (vì 4=22); x = y / 4 → x = y >> 2; x = 3 * y giữ nguyên (3 không phải lũy thừa của 2); x = y * 1 giữ nguyên (20=1 không hợp lệ).
x = a op b (các token cách nhau đúng một khoảng trắng), op∈{+,−,∗,/}; a,b là số nguyên không âm (0≤⋅≤230) hoặc tên biến (chuỗi chữ cái/số, ký tự đầu là chữ cái).In ra n dòng, mỗi dòng là lệnh sau khi áp dụng quy tắc (giữ đúng định dạng x = ..., dùng << hoặc >> khi có thay đổi). Nếu n=0 thì không in gì.
Ví dụ:
Đầu vào:
0
Đầu ra:
Đầu vào:
6
x = 4 * y
x = y * 8
x = y / 4
x = 3 * y
x = 2 * 3
x = y + z
Đầu ra:
x = y << 2
x = y << 3
x = y >> 2
x = 3 * y
x = 2 * 3
x = y + z
Đang tải editor...