首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

求算法思路解决方法

2013-03-19 
求算法思路有这样一个需求,不大好表达,例子如下:两个int类型的数a,b。 其中 a 195,二进制表示为: 0000 00

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

两个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);


printf("(%08x, %08x)\n", a, b);
update(a, &b);
printf("(%08x, %08x)\n", a, b);
update(a, &b);
printf("(%08x, %08x)\n", a, b);
update(a, &b);
printf("(%08x, %08x)\n", a, b);

return 0;
}

// (000000c3, 00000080)
// (000000c3, 000000c0)
// (000000c3, 000000c2)
// (000000c3, 000000c3)


[解决办法]
我的想法是:对a进行一位一位地测试,如果为1,则把该位加到b中。

热点排行