本文主要介绍一系列算法,算法主要功能是判断一个数字(二进制)中是否包含全零字节
e.g.1010 1111 0000 0000 1001 1111 0001 1111
即 32位整数:A4A3A2A1中Ai =0(i=1 or 2 or 3 or 4)
// 较少操作算法版本: unsigned int v; // 32位整型目标整数判断是否包含全0字节 bool hasZeroByte = ~((((v & 0x7F7F7F7F) + 0x7F7F7F7F) | v) | 0x7F7F7F7F);
原理:
0x7F7F7F7F=0111 1111 0111 1111 0111 1111 0111 1111
v & 0x7F7F7F7F:将v的第8、16、24、32位都置为0,其余位不变
我们不妨设A2=0
执行完 (v & 0x7F7F7F7F)+0x7F7F7F7F , A2=0111 1111
再执行(v & 0x7F7F7F7F)+0x7F7F7F7F | v, A2=0111 1111
执行 ((v & 0x7F7F7F7F)+0x7F7F7F7F | v) | 0x7F7F7F7F, A2=0111 1111
最后执行 ~(((v & 0x7F7F7F7F)+0x7F7F7F7F | v) | 0x7F7F7F7F) A2=1000 0000 !=0
hasZeroByte=true
操作步骤较多的算法:
bool hasNoZeroByte = ((v & 0xff) && (v & 0xff00) && (v & 0xff0000) && (v & 0xff000000))
或者如下的算法:
unsigned char * p = (unsigned char *) &v; bool hasNoZeroByte = *p && *(p + 1) && *(p + 2) && *(p + 3);
原理比较简单
作者:xueda120
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.