位掩码操作逻辑不清晰,询问findWhat函数返回值及右移1位的原因
问题解答
右移1位操作的原因
首先明确两个掩码的二进制特征:
0x55555555二进制为01010101 01010101 01010101 01010101,作用是提取输入参数的偶数索引位(从最低位开始从0计数,即bit0、bit2、bit4……bit30)0xAAAAAAAA二进制为10101010 10101010 10101010 10101010,作用是提取输入参数的奇数索引位(即bit1、bit3、bit5……bit31)
从最低位开始每两个相邻位为一组的话,奇数索引位是每组的高位,比同组的偶数索引位(每组低位)高1位。右移1位的作用就是把提取到的奇数索引位,对齐到同组偶数索引位的下标位置,方便后续逐组比较两个位的取值。
函数返回值的含义
逐行拆解逻辑:
bitmaskOdd存储所有分组的低位取值,每一位对应一组的低位值bitmaskEven存储所有分组的高位取值,右移后每一位对应一组的高位值bitmaskXor = bitmaskOdd ^ bitmaskEven:异或运算的特性是相同为0、不同为1,所以bitmaskXor中值为1的位置,代表对应分组的两个位取值不同bitmaskXor & bitmaskEven:如果该运算结果不为0,说明存在至少一个分组,两个位取值不同且高位为1,也就是该分组的二进制值为10(十进制的2)
最终结论:
函数返回TRUE的条件是:输入的32位无符号整数按从低到高每两位为一组拆分后,存在至少一组的取值为2(二进制10);否则返回FALSE。
内容的提问来源于stack exchange,提问作者LigLig
相关产品推荐
相关产品推荐

