求算法思路解决方法

求算法思路
有这样一个需求,不大好表达,例子如下:

两个int类型的数a,b。 其中 a = 195,二进制表示为: 0000 0000 1100 0011
       
                a = 0000 0000 1100 0011
第1次,让 b=  0000 0000 1000 0000
第2次,  让 b = 0000 0000 1100 0000
第3次,  让 b = 0000 0000 1100 0010
第3次,  让 b = 0000 0000 1100 0011

规律是:b 每次都是更新到a下一个为1的比特位置。

------解决方案--------------------

void foo(int a, int* b, int& n)
{
  for(n=0;a;n++,a=a^(a&-a))
    b[n] = a;
  for(int i=0;i<n-1-i;i++)
    swap(b[i],b[n-1-i]);
}

输出b数组和b数组的长度n。
------解决方案--------------------
# include <stdio.h>

struct x {
    int n;
    int p[32];
};

void foo(unsigned int a, struct x * xx)
{
    int i;
    int j = 0;
    xx->n = 0;
    for (i = 0; i < 32; i++)
    {
        if ((a << i) & 0x80000000)
        {
            xx->p[j++] = i;
            xx->n++;
        }
    }
}

int main(void)
{
    int a = 195;
    struct x xx;
    int b = 0;
    int i;

    foo(a, &xx);

    for (i = 0; i < xx.n; i++)
    {
        b = ((unsigned int)b) 
------解决方案--------------------
 (0x01 << (31 - xx.p[i]));
        printf("%x\n", b);
    }

    return 0;
}

------解决方案--------------------

#include <stdio.h>

void update(int a, int* b)
{
int flag = 1;
int i = 31;
int mask;

while(flag && (i >= 0))
{
mask = 1 << i--;
if((a & mask) && (!(*b & mask)))
{
*b 
------解决方案--------------------
= mask;
flag = 0;
}
}
}

int main(int argc, char* argv[])
{
int a = 195;
int b = 0;

update(a, &b);