Về cơ bản, hành vi bạn nhận được khi tràn các số nguyên trừ, nhưng đối với một số bit nhất định. Cách rõ ràng, giả sử một ký số nguyên:Phép trừ số nguyên với bọc xung quanh cho N bit
template <int BITS>
int sub_wrap(int v, int s) {
int max = (1<<(BITS));
v -= s;
if (v < -max) v += max*2;
// or if branching is bad, something like:
// v += (max*2) * (v < -max)
return v;
}
// For example subtracting 24 from -16 with 5 bit wrap,
// with a range of -32, 31
sub_wrap<5>(-16, 28); -> 20
Có cách gọn gàng để làm việc đó có nghĩa là ít xấu xí và tốt nhất là nhanh hơn so với một ở trên?
CẬP NHẬT: Xin lỗi về sự nhầm lẫn. Tôi vô tình bao gồm các ký hiệu khó hiểu về việc sử dụng số lượng bit không bao gồm tiếng thở dài. Vì vậy, ở trên, thay thế 5 bit với 6 bit cho rất nhiều sanity.
Bạn cũng cần phải kiểm tra cho 'v> = max'. – interjay
Phạm vi từ -32 đến 31 yêu cầu 6 bit, không phải là 5. – TonyK
Điều đó hoàn toàn phụ thuộc vào quan điểm của bạn. Tôi chỉ được sử dụng để biểu thị số lượng bit không bao gồm các dấu hiệu trong mã tôi hiện đang sử dụng, nhưng tôi đoán đó chỉ là khó hiểu. – porgarmingduod