Rounding an unsigned integer x down to, for example, the next smaller multiple of 8, is trivial: x & -8 does it. An alternative is These work for signed integers as well, provided "round down" means to round in the negative direction (e.g., (-37) & (-8) = -40).
Rounding up is almost as easy. For example, an unsigned integer x can be rounded up to the next greater multiple of 8 with either of
These expressions are correct for signed integers as well, provided "round up" means to round in the positive direction. The second term of the second expression is useful if you want to know how much you must add to x to make it a multiple of 8 [Gold].
To round a signed integer to the nearest multiple of 8 toward 0, you can combine the two expressions above in an obvious way:
An alternative for the first line is which is useful if the machine lacks and immediate, or if the constant is too large for its immediate field.
Sometimes the rounding factor is given as the log2 of the alignment amount (e.g., a value of 3 means to round to a multiple of 8). In this case, code such as the following may be used, where k = log2(alignment amount):