Author: | Wojciech Muła |
---|---|
Added on: | 2014-03-09 |
The description of Determine if a word has a zero byte from "Bit Twiddling Hacks" says about haszero(v): "the result is the high bits set where the bytes in v were zero".
Unfortunately this is not true. The high bits are also set for ones followed zeros, i.e. haszero(0xff010100) = 0x00808080. Of course the result is still valid (non-zero if there were any zero byte), but if we want to iterate over all zeros or find the last zero index, this could be a problem.
It's possible to create an exact mask:
uint32_t nonzeromask(const uint32_t v) { // MSB are set if any of 7 lowest bits are set const uint32_t nonzero_7bit = (v & 0x7f7f7f7f) + 0x7f7f7f7f; return (v | nonzero_7bit) & 0x80808080; } uint32_t zeromask(const uint32_t v) { // negate MSBs return (nonzeromask(v)) ^ 0x80808080; }
Function nonzeromask requires four simple instructions, and zeromask one additional xor.