Можно решить задачу по другому, а именно исходить от 2-ой СС (по моему это будет быстрее).
!!Нумерация битов, в моем размышлении, идет с конца, т.к. в машине старшему биту соответствует старшая ячейка!!
Если число нечетное (т.е. первый бит равен 1), то достаточно сдвинуть последний бит влево.
Например:
000000
11 -> 00000
101; 0000000
1 -> 000000
10; 001100
11 -> 00110
101;
Если число четное (т.е. первый бит равен 0), то делаем тоже самое, только с модификацией, а именно, мы все биты до последнего бита перемещаем в начало и первые нули мы игнорируем.
Например:
000000
10 -> 00000
100; 00000
110 -> 0000
1001; 00
110000 -> 0
1000001;
Вот код, написанный на С++:
|
Код:
|
#include <stdio.h>
int main()
{
int a;
scanf("%d", &a);
int i = 1;
if (a & 1)
{
while ((a >> i) & 1)
i++;
a &= ~(1 << (i - 1));
a |= (1 << i);
}
else
{
while (((a >> i) & 1) == 0)
i++;
int count = 0;
while ((a >> i) & 1)
{
a &= ~(1 << i);
i++;
count++;
}
a &= ~(1 << (i - 1));
a |= (1 << i);
count--;
for (i = 0; i < count; i++)
a |= (1 << i);
}
printf("%d\n", a);
return 0;
} |