Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2013, 18:49   #1
ivan1492
 
Регистрация: 18.03.2013
Сообщений: 5
По умолчанию Обратный порядок битов в двоичном коде. (Си)

Выполнить зеркальную перестановку (обратный порядок) в группе рядом стоящих разрядов (восьмибитное число), количество которых и номер старшего разряда в группе задаются с клавиатуры. (использовать только логические операции :&,|, >>,~)
Нашел одну функцию:
Код:
int peres(int a1, int n1, int m1)
{	 
   int bn = a1 & (1<<n1);
   int bm = a1 & (1<<m1);
   a1 = a1 & (~(1<<n1)) & (~(1<<m1)); 

   if (bn) a1 = a1 | (1<<m1); 
   if (bm) a1 = a1 | (1<<n1); 
   return a1;
}
но не всегда работает, и не понимаю как организовать цикл, чтоб определенное число битов меняло.
ivan1492 вне форума Ответить с цитированием
Старый 18.03.2013, 19:34   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,351
По умолчанию

Цитата:
но не всегда работает
Может быть я не вижу очевидного - эта функция В ПРИНЦИПЕ не делает перестановки в числе. Она делает следующее:
Сохраняет в bn и bm n-й и m-й биты, соответственно.
Обнуляет n-й и m-й биты числа а.
Затем, если n-й бит исходного числа не равен 0, то устанавливается в 1 m-й бит и наоборот.
Код:
#include <stdio.h>
#include <conio.h>
#include <windows.h>

int
output(unsigned int x)
{
    int i;
    for (i = 8 * sizeof(x) - 1; i > -1; i--)
        printf("%d",x >> i & 1);
    printf("\n");
}

unsigned int
reverse(unsigned int x, int c, int n)
{
    int shift = n - c + 1;
    unsigned int mask = ((1 << c) - 1) << shift;
    unsigned int ext = (x & mask) >> shift;
    unsigned int rev_ext = 0;
    int i;
    for (i = 0; i < c; ++i) {
        rev_ext <<= 1;
        rev_ext |= ext & 1;
        ext >>= 1;
    }
    rev_ext <<= shift;
    return (x & ~mask) | rev_ext;
}

int
main()
{
    system("cls");

    unsigned int a;
    printf("Enter the number: ");
    scanf("%u", &a);
    output(a);

    int count;
    printf("Enter count: ");
    scanf("%d", &count);

    int num;
    printf("Enter first number: ");
    scanf("%d", &num);

    a = reverse(a, count, num);

    printf("\n");
    output(a);
    printf("%u\n", a);

    getch();
    return 0;
}
Халява, редко, но бывает
Проверьте работоспособность.
Входные данные не проверяются на корректность.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 18.03.2013 в 20:08.
BDA на форуме Ответить с цитированием
Старый 18.03.2013, 21:08   #3
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,680
По умолчанию

BDA красиво.........
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 18.03.2013, 21:24   #4
ivan1492
 
Регистрация: 18.03.2013
Сообщений: 5
По умолчанию

BDA, спасибо большое, вроде работает.
ivan1492 вне форума Ответить с цитированием
Старый 18.03.2013, 21:44   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,351
По умолчанию

Цитата:
Сообщение от Bugrimov Посмотреть сообщение
BDA красиво.........
Нет предела красоте
Вот так короче:
Код:
unsigned int
reverse(unsigned int x, int c, int n)
{
    unsigned int m1 = 1 << (n - c + 1), m2 = 1 << n;
    int shift = c - 1, i;
    for (i = 0; i < c/2; ++i, m1 <<= 1, m2 >>= 1, shift -= 2)
        x = (x & ~m1 & ~m2) | (x & m1) << shift | (x & m2) >> shift;
    return x;
}
Кстати, только после написания этого поста до меня дошел сакральный смысл той функции - она меняла n-й и m-й биты местами.
Цитата:
Сообщение от ivan1492 Посмотреть сообщение
BDA, спасибо большое, вроде работает.
Пожалуйста.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 18.03.2013 в 21:46.
BDA на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обратный порядок списка RevenGGe Паскаль, Turbo Pascal, PascalABC.NET 8 17.10.2012 11:20
Обратный порядок Vapali-Pik Помощь студентам 0 28.07.2011 00:39
Обратный порядок G. J. Cezar Общие вопросы C/C++ 2 22.10.2010 15:10
Обратный алфавитный порядок ~GVS Помощь студентам 0 21.04.2010 15:54
Обратный порядок вывода (системы счис.) forsaken66 Общие вопросы C/C++ 2 17.10.2009 01:45