Came across this question in one of the interview samples. A 16-byte aligned allocation has already been answered in How to allocate aligned memory only using the standard library?
But, I have a specific question in the same regarding the mask used to zero down the last 4 bits. This mask “~0F” has been used such that the resulting address is divisible by 16. What should be done to achieve the same for 32-byte alignment/divisibility?
First, the question you referred to is 16-byte alignment, not 16-bit alignment.
Regarding your actual question, you just want to mask off 5 bits instead of 4 to make the result 32-byte aligned. So it would be
~0x1F.To clarify a bit:
To align a pointer to a 32 byte boundary, you want the last 5 bits of the address to be 0. (Since 100000 is 32 in binary, any multiple of 32 will end in 00000.)
0x1F is 11111 in binary. Since it’s a pointer, it’s actually some number of 0’s followed by 11111 – for example, with 64-bit pointers, it would be 59 0’s and 5 1’s. The ~ means that these values are inverted – so ~0x1F is 59 1’s followed by 5 0’s.
When you take
ptr & ~0x1F, the bitwise & causes all bits that are &’ed with 1 to stay the same, and all bits that are &’ed with 0 to be set to 0. So you end up with the original value of ptr, except that the last 5 bits have been set to 0. What this means is that we’ve subtracted some number between 0 and 31 in order to make ptr a multiple of 32, which was the goal.