Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Поразрядная обработка целых чисел.


Автор: NiDaY 9.12.2007, 18:06
В длинном целом числе N поменять пары двоичных разрядов  в зеркальном порядке.  Код С++. Большое спасибо!

Автор: likehood 9.12.2007, 21:44
Код

#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;
}

Автор: NiDaY 10.12.2007, 00:31
Цитата

Код

for (int i=0; i<nBit/2; i++)
   {
        long lowBit = N & mask1;
        if (N & mask2)
            N |= mask1;
        else
            N &= ~mask1;
        
        if (lowBit)
            N |= mask2;
        else
            N &= ~mask2;
        mask1 <<= 1;
        mask2 >>= 1;
    }


 Напиши пожалуйста комментарий по этому циклу.




Автор: likehood 10.12.2007, 13:51
Цитата(NiDaY @  10.12.2007,  00:31 Найти цитируемый пост)
Напиши пожалуйста комментарий по этому циклу

Сделал. Смотри предыдущее сообщение.

Автор: NiDaY 12.12.2007, 10:23
Thanks!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)