Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
Neroff
3 / 3 / 1
Регистрация: 06.02.2010
Сообщений: 12
1

В длинном целом числе n поменять пары двоичных разрядов в зеркальном порядке

30.11.2011, 02:12. Просмотров 1238. Ответов 6
Метки нет (Все метки)

всем снова привет.

есть задача: "в длинном целом числе N поменять пары двоичных разрядов в зеркальном порядке"
то есть из числа 6969(1101100111001) должно получиться что-то около 3495(0110110100111). Вот то что у меня получилось:


C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
void main(void)
{
    unsigned long num,N,tmp;
    int i,k,nBit,m;
    unsigned long mask1, mask2;
    num=i=k=nBit=0;
 
    scanf("%lu", &N);
    tmp = N;
    while (N) 
    {
        ++nBit;
        N>>=1;
    }
 
    N = tmp;
 
   mask2=(int)(pow((double)2,nBit-1)+(int)pow((double)2,nBit-2));
   mask1=(int)(pow((double)2,0)+(int)pow((double)2,1));
        
   m=2;k=0;
   for (i=0; i<nBit/2-1; i+=2)
   {
    k+=2;
    num|=(N&mask2)>>(nBit-k);
    num|=(N&mask1)<<(nBit-m);
    mask1=mask1<<2;
    mask2=mask2>>1;
    m+=4;
    }
    printf("%lu", num);
}
На некоторых числах работает(506->327), а вот на числе приведенном выше вылезает другое число, отличное от ожидаемого ровно на 32. то есть западает самый центральный разряд. не знаю как с этим справится..

очень надеюсь на вашу помощь, потому как свой глаз уже как-то замылился и не вижу где именно ошибка.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.11.2011, 02:12
Ответы с готовыми решениями:

В длинном целом числе N поменять тетрады (четыре соседних двоичных разряда) в зеркальном порядке
Нужно досдать последнюю работу в семестре, а программу не могу написать уже второй день. Друг...

В длинном целом числе N поменять тетрады (четыре соседних двоичных разряда) в зеркальном порядке
Помогите,пожалуйста,написать программу.В длинном целом числе N поменять тетрады (четыре соседних...

В длинном целом числе N числе поменять байты в зеркальном порядке
В длинном целом числе N числе поменять байты в зеркальном порядке. используя только библиотеку...

В длинном целом числе N поменять байты в зеркальном порядке
Здравствуйте! Я тут столкнулся с такой проблемой - не могу понять с чего начать решать задачу......

В длинном целом числе поменять местами нулевой разряд с первым разрядом
Здраствуйте! Подскажите пожалуйста. Такая задача: В длинном целом числе поменять местами нулевой...

6
golatin
282 / 240 / 53
Регистрация: 12.10.2011
Сообщений: 383
Завершенные тесты: 1
30.11.2011, 12:10 2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
    unsigned long num=0,N;
    scanf("%lu", &N);
    while(N)
    {
        num^=(N&3);
        N=N>>2;
        num=num<<2;
    }
    num=num>>2;
    printf("%lu", num);
    return 0;
}
Да и 6969 будет (01 10 11 00 11 10 01) -> результат будет также 6969
506 (01 11 11 10 10) -> (10 10 11 11 01) 701
1
accept
4836 / 3258 / 464
Регистрация: 10.12.2008
Сообщений: 10,569
30.11.2011, 16:34 3
Цитата Сообщение от Neroff Посмотреть сообщение
в длинном целом числе N поменять пары двоичных разрядов в зеркальном порядке
Цитата Сообщение от Neroff Посмотреть сообщение
из числа 6969(1101100111001) должно получиться что-то около 3495(0110110100111)
и где тут зеркальный порядок ?
1
Neroff
3 / 3 / 1
Регистрация: 06.02.2010
Сообщений: 12
30.11.2011, 18:14  [ТС] 4
golatin, большое спасибо.
Вчера видимо заучился и пытался сделать через пень колоду. Ваша программа удивительно кратка и работоспособна
0
eelya
0 / 0 / 0
Регистрация: 16.04.2018
Сообщений: 10
20.05.2018, 15:36 5
здравствуйте, не могли бы объяснить что происходит в этой программе, построчно? хотелось бы полностью разобраться.
0
stake-k26
662 / 458 / 350
Регистрация: 25.04.2016
Сообщений: 1,317
20.05.2018, 16:21 6
eelya, на счет битовых операций гуглите в интернете, например тут.

А в остальном:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// пропущен #include <stdio.h>
int main (void)
{
    unsigned long num=0,N;  // unsigned long num, N; num = 0;
    scanf("%lu", &N);       // прочитать с клавиатуры unsigned long и записать в N
    while(N)                // while (N != 0)
    {   // кучка побитовых операций:
        num^=(N&3);         // num = num^(N&3);
        N=N>>2;
        num=num<<2;
    }
    num=num>>2;
    printf("%lu\n", num);   // вывести на экран получившееся число num
    return 0;               // конец программы
}
0
eelya
0 / 0 / 0
Регистрация: 16.04.2018
Сообщений: 10
20.05.2018, 18:17 7
Спасибо!
0
20.05.2018, 18:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2018, 18:17

Определить положение старшей единицы в длинном целом числе N
Задание: Определить положение старшей единицы в длинном целом числе N.

В длинном целом числе N все серии единиц, состоящие из трёх и более единиц, заменить на нули
Доброго всем времени суток,задали написать программу,но с чего начать и как делать,не сказали....

В массиве из 10 целых чисел поменять в зеркальном порядке элементы массива
В массиве из 10 целых чисел поменять в зеркальном порядке элементы массива, стоящие левее...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru