有人的实现是从低位循环,每3位确认一下,虽然可以也没什么问题……
但是还是嫌判断分支太多
我的解决是无判断的,纯位计算
思想是把001这个特征用位运算变成010,然后或运算解决
所以每一轮可以同时进行001001001001001.多段同时扫描
3轮的差别是移位一下
设3个位分别是abc
001=>0,1,0
即0, a=0 & b=0 & c=1, 0
通过移位和0b010 010 010 010 ....做运算
可以一次性得出32位/3=10段位特征信息,然后或运算就能一次处理掉10个段
当发生处理时,我们还需要保护这个段避免2次修改,需要一个新的掩码数防止修改,这个掩码数=补位<<1 | 补位 | 补位>>1
void printfBinary(const char* str, int a)
{
printf("%s", str);
for(int i = 31; i >= 0; --i)
printf("%d", (a & (1<<i)) != 0);
printf("\n");
}
int _tmain(int argc, _TCHAR* argv[])
{
int mask2 = 306783378; //010 010 010 010 ....
unsigned int input_origin = 5165156315; //153391689 ; //a b c
unsigned int input = input_origin;
unsigned int limit = 0;
printfBinary("输入:", input);
unsigned int tmpc;
unsigned int tmpb;
unsigned int tmpa;
unsigned int limit_m;
unsigned int tmp = 0;
for(int i = 0; i < 3; ++i)
{
input = input_origin >> i;
limit = 0;
tmpc = input<<1 ;
//* c *
tmpb = ~input;
//* ~b *
tmpa = ~(input>>1);
//* ~a *
limit_m = ~limit | (~limit >> 1) | (~limit << 1);
//* ~la~lb~lc *
tmp |= tmp | ((mask2 & tmpa & tmpb & tmpc & limit_m) << i);
//0 ~a&~b&c&~l 0
printfBinary("补位:", tmp);
limit = tmp<<1 | tmp | tmp>>1;
printfBinary("保护:", limit);
}
printfBinary("结果:", input_origin | tmp);
return 0;
}