Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 09.10.2008
Сообщений: 18
1

Поменять местами все соседние группы из двух битов в заданом беззнаковом длинном числе

11.10.2008, 13:54. Показов 2488. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задача.
Испольхуя только битовые операции, написать программу, которая меняет местами все соседние групы с 2х битов в заданом беззнаковом длинном числе.
Пример
с 01001110 сделать 00011011
xxaazzbb = aaxxbbzz

каким образом сделать такую программу НЕ ИСПОЛЬЗУЯ:
*, /, условные операторы, циклы, рекурсию, ?, : .

Помогите розобратьса пож
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.10.2008, 13:54
Ответы с готовыми решениями:

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

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

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

Как в выделенном диапазоне из двух столбцов поменять соседние значения местами.
помогите пожалуйста

8
10 / 10 / 2
Регистрация: 18.08.2008
Сообщений: 127
11.10.2008, 19:13 2
маски и сдвиги
xxaazzbb = aaxxbbzz
1)xxaazzbb&11000000=xx000000+2*(сдвиг вправо)=00xx0000;
2)xxaazzbb&00110000=00aa0000+2*(сдвиг влево )=aa000000;
3)xxaazzbb&00001100=0000zz00+2*(сдвиг вправо)=000000zz;
4)xxaazzbb&00000011=000000bb+2*(сдвиг влево )=0000bb00;
5)00xx0000+aa000000+000000zz+0000bb00=aaxxbbzz;

примечание: (1) и (3) как (2) и (4) можно объединить
(сдвиг влево) это умножение на 2[или 10 в десятичной системе ]
(сдвиг вправо) это деление на 2 [или 10 в десятичной системе ]
0
0 / 0 / 0
Регистрация: 09.10.2008
Сообщений: 18
11.10.2008, 19:47  [ТС] 3
Давай отобразим єто в коде
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream.h>
int rezultat(int a);
void main()
{
    long int a;
    cout<<"Vvedite chuslo:";
    cin>>a;
    rezultat(a);
}
int rezultat(int a,int a2)
{
просто заполнить функцию Результат вот єтим:

1)xxaazzbb&11000000=xx000000+2*(сдвиг вправо)=00xx0000;
2)xxaazzbb&00110000=00aa0000+2*(сдвиг влево )=aa000000;
3)xxaazzbb&00001100=0000zz00+2*(сдвиг вправо)=000000zz;
4)xxaazzbb&00000011=000000bb+2*(сдвиг влево )=0000bb00;

где xxaazzbb = a ?

Добавлено через 5 минут 6 секунд
int rezultat(long int a

Добавлено через 12 минут 50 секунд
у мну форум лагает, немогу редактировать =\
Есть еще 1н вопрос, при таком методе хорошо когда битов только 8.
В задаче говоритьса о беззнаковом целом длинном числе, которое = unsigned long int = 32 bita..... как быть в таком случае? я думал делать вот так:
(пример на 8битном числе)
10 11 01 11 (например єто число введенное пользывателем)
сначала сдиваего вправо на 2 позиции, имеем:
00 10 11 01
потом влево:
11 01 11 00

в итоге:
нужно с 10 11 01 11 сделать 11 10 11 01, а это додать 2 нижних числа "крестообразным образом
00 10 11 01
---/-\--/--
11 01 11 00

--10---01
--/-\--/
11--11


Можно ли както сделать так ? я смотрел на логические операции.... не особо они мне помогают в таком случае, как по мне лог операции тут и не помогут...

Заинтересовалса вот этим:
xxaazzbb&11000000
а можна сделать вот так:
а1&110011001100 (32 раза, а сдвинутое влево а)
a2&001100110011(32 раза, где а2 сдвинутое вправо а )
и потом а1+а2 ?
0
10 / 10 / 2
Регистрация: 18.08.2008
Сообщений: 127
11.10.2008, 20:41 4
http://content.mail.ru/arch/23186/1596749.html

http://ad.cctpu.edu.ru/cpp/glava3_5.htm
или

Побитовые операции в с++ в Гугл
Поразрядные операции в с++

Там уже прямая дорога . Не хочу у тебя забирать радость самостоятельного написания программы .
0
0 / 0 / 0
Регистрация: 09.10.2008
Сообщений: 18
11.10.2008, 23:49  [ТС] 5
я не прошу написать мне программу я прошу задать мне правильное направление поиска информации. Я смотрел битовые операции и не нашел там выхода из ситуации =\\ мб плохо искал =)
0
118 / 12 / 3
Регистрация: 21.08.2007
Сообщений: 222
12.10.2008, 11:27 6
Испольхуя только битовые операции, написать программу, которая меняет местами все соседние групы с 2х битов в заданом беззнаковом длинном числе.
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
37
38
39
40
41
#include <stdio.h>
#include <math.h>
//32-specific
#define BITS 32
 
//cyclic shifting 
#define ROL(x, skew) ((x << (skew)) | (x >> (BITS - (skew))))
#define ROR(x, skew) ((x >> (skew)) | (x << (BITS - (skew))))
 
/*
 binary
 wwxxaabbccddyyzz -> xxwwbbaaddcczzyy
 * */
 
//32-specific
unsigned long PairSwap (unsigned long arg) {
 
    return ((ROL(arg, 2) & 0xccccccccU ) | (ROR(arg, 2) & 0x33333333U));
 
}
 
//print binary code
void print_bin(unsigned long arg) {
 
    for(unsigned long i = pow(2, sizeof(long) * 8 - 1); i > 0; i /= 2)
        printf("%c", (arg & i) > 0 ? '1': '0');
 
    printf("%c", '\n');
 
}
 
int main(void) {
 
    unsigned long a = 51;
    printf("a = ");
    print_bin(a);
    unsigned long b = PairSwap(a);
    printf("after PairSwap() a = ");
    print_bin(b);
 
}
Как видишь есть привязка к длине машинного слова. Если писать без привязки, без логических операций не обойтись, т. к. вычисление длины машинного слова будет в рантайме.
0
0 / 0 / 0
Регистрация: 09.10.2008
Сообщений: 18
12.10.2008, 18:16  [ТС] 7
Обьесните пож роботу вот этого:
C++
1
2
#define ROL(x, skew) ((x << (skew)) | (x >> (BITS - (skew))))
#define ROR(x, skew) ((x >> (skew)) | (x << (BITS - (skew))))
что делает вот этот кусок кода:
(BITS - (skew))))
И вот это:
C++
1
return ((ROL(arg, 2) & 0xccccccccU ) | (ROR(arg, 2) & 0x33333333U));
& 0xccccccccU
& 0x33333333U
То, что это битовое И, а что есть 0x33333333U и 0xccccccccU не понимаю =\

Добавлено через 1 минуту 51 секунду
* То, что это битовое И я понял, а что есть 0x33333333U и 0xccccccccU не понимаю =\

Не редактирует предыдущий пост =\\
0
0 / 0 / 0
Регистрация: 09.10.2008
Сообщений: 18
15.10.2008, 01:27  [ТС] 8
ап
0
10 / 10 / 2
Регистрация: 18.08.2008
Сообщений: 127
15.10.2008, 23:58 9
смотри https://www.cyberforum.ru/newr... =1&p=61681

в 2.4.1 Целые Константы

Добавлено через 13 минут 51 секунду
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
37
38
39
40
41
#include <stdio.h>
#include <math.h>
//32-specific
#define BITS 32  // макрос все BITS заменяются числом 32
 
//cyclic shifting 
#define ROL(x, skew) ((x << (skew)) | (x >> (BITS - (skew)))) // макрос "функция" x и skrew параметры 
#define ROR(x, skew) ((x >> (skew)) | (x << (BITS - (skew))))
 
/*
 binary
 wwxxaabbccddyyzz -> xxwwbbaaddcczzyy
 * */
 
//32-specific
unsigned long PairSwap (unsigned long arg) {
 
    return ((ROL(arg, 2) & 0xccccccccU ) | (ROR(arg, 2) & 0x33333333U));  // 0xccccccccU и 0x33333333U число представленое в шеснадцатиричном коде U -длиное
 
}
 
//print binary code
void print_bin(unsigned long arg) {
 
    for(unsigned long i = pow(2, sizeof(long) * 8 - 1); i > 0; i /= 2)
        printf("%c", (arg & i) > 0 ? '1': '0');
 
    printf("%c", '\n');
 
}
 
int main(void) {
 
    unsigned long a = 51;
    printf("a = ");
    print_bin(a);
    unsigned long b = PairSwap(a);
    printf("after PairSwap() a = ");
    print_bin(b);
 
}
0
15.10.2008, 23:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.10.2008, 23:58
Помогаю со студенческими работами здесь

Список: Необходимо все соседние элементы поменять местами
Дан список, из случайных значений. Необходимо все соседние элементы поменять местами. Исходное а1...

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

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

Написать функцию которая в заданом числе меняет местами два бита с задаными номерами
Сижу на экзамене очень сильно нужна помощь: задание - написать функцию которая в заданом числе...

В длинном целом числе n поменять пары двоичных разрядов в зеркальном порядке
всем снова привет. есть задача: &quot;в длинном целом числе N поменять пары двоичных разрядов в...

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru