Mar*_*som 10
您需要检查每个4位数量以确保它小于10.为了提高效率,您希望一次处理尽可能多的位.
在这里,我将数字分开以在每个数字之间留下零,然后为每个数字加6并检查溢出.
uint32_t highs = (value & 0xf0f0f0f0) >> 4;
uint32_t lows = value & 0x0f0f0f0f;
bool invalid = (((highs + 0x06060606) | (lows + 0x06060606)) & 0xf0f0f0f0) != 0;
Run Code Online (Sandbox Code Playgroud)
编辑:实际上我们可以做得更好.它不需要4位来检测溢出,只有1.如果我们将所有数字除以2,它会释放一些,我们可以立即检查所有数字.
uint32_t halfdigits = (value >> 1) & 0x77777777;
bool invalid = ((halfdigits + 0x33333333) & 0x88888888) != 0;
Run Code Online (Sandbox Code Playgroud)