将一个4字节的整数的二进制表示中的001替换为011,输出替换后的整数。

来源:互联网 发布:魔兽世界巨鹰飞行网络 编辑:程序博客网 时间:2024/06/04 19:41

有人的实现是从低位循环,每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;
}

 

原创粉丝点击