| Код | #include <stdio.h>
int main() { unsigned long N, N0; int nBit=0; scanf("%lu", &N); N0 = N; while (N) { ++nBit; N>>=1; } N = N0; unsigned long mask1 = 1, mask2 = 1; for (int i=0; i<nBit-1; i++) mask2 <<= 1; for (int i=0; i<nBit/2; i++) { long lowBit = N & mask1; // N & mak1 - младший бит if (N & mask2) // N & mask2 - старший бит числа N |= mask1; // в младший бит заносим 1 (если старший равен 1) else N &= ~mask1; // иначе в младший бит 0; ~mask1 - инверсия mask1 (1->0, 0->1) if (lowBit) // аналогично поступаем со старшим битом N |= mask2; else N &= ~mask2; mask1 <<= 1; // сдвигаем маску младшиго бита на 1 влево (переходим к след. биту) mask2 >>= 1; // маску старшего бита - на 1 вправо } printf("before: %lu, after: %lu\n", N0, N); return 0; }
|
|