求算法思路解决方法
求算法思路
有这样一个需求,不大好表达,例子如下:
两个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的比特位置。
------解决方案--------------------
输出b数组和b数组的长度n。
------解决方案--------------------
------解决方案--------------------
有这样一个需求,不大好表达,例子如下:
两个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);