标题:位运算在算法中的运用


问题1:计算整数二进制中含有多少个1

size_t CountOne(int num)

{

       size_t count = 0;

      

       while (num)

       {

              ++count;

              num &= (num - 1);

       }

 

       return count;

}

 

size_t count_one(unsigned int x)

{

    size_t count = 0;

    while(x)

    {

       count += (x&1);

      x >>= 1;

    }

    return count;

}

 


问题2:交换2个整数的值

void swap(int *a, int *b) 
{ 
    *a = *a ^ *b; 
    *b = *a ^ *b; 
    *a = *a ^ *b;
 }

问题3:用异或运算设计一个只有一个指针域的双向链表

提示: 
要实现该设计要求,需要记住链表的头结点和尾结点,并在链表结点的的next域存放前一个结点和后一个结点的异或值。即: 
p->next=pl^pr;//头结点的左边结点为NULL,尾结点的右边结点为NULL。 
在遍历的时候,从头结点往右遍历的方法: 
pl=NULL;
p=Head; 
while(p!=Tail) 
{ 
    pr=pl^(p->next); 
    pl=p; 
    p=pr;
 } 
从尾结点往左遍历的方法: 
pr=NULL; 
p=Tail; 
while(p!=Tail)
{ 
    pl=pr^(p->next); 
    pr=p; 
    p=pl; 
} 


看文字不过瘾?点击我,进入周哥教IT视频教学
麦洛科菲长期致力于IT安全技术的推广与普及,我们更专业!我们的学员已经广泛就职于BAT360等各大IT互联网公司。详情请参考我们的 业界反馈 《周哥教IT.C语言深学活用》视频

我们的微信公众号,敬请关注