Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
AquaSky
0 / 0 / 0
Регистрация: 09.10.2008
Сообщений: 18
#1

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

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

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

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

Помогите розобратьса пож
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.10.2008, 13:54     Поменять местами все соседние группы из двух битов в заданом беззнаковом длинном числе
Посмотрите здесь:

C++ В заданом одномерном масиве целого типа поменять местами следующие два элемента: первый минимальный и последний максимальный
Поменять соседние слова в строке местами C++
Поменять соседние слова местами C++
Поменять местами каждые соседние слова C++
C++ Поменять соседние числа местами
C++ Написать функцию которая в заданом числе меняет местами два бита с задаными номерами
C++ Массив: поменять местами соседние строки двумерного массива
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
qwone
8 / 8 / 1
Регистрация: 18.08.2008
Сообщений: 129
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 в десятичной системе ]
AquaSky
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 ?
qwone
8 / 8 / 1
Регистрация: 18.08.2008
Сообщений: 129
11.10.2008, 20:41     Поменять местами все соседние группы из двух битов в заданом беззнаковом длинном числе #4
http://content.mail.ru/arch/23186/1596749.html

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

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

Там уже прямая дорога . Не хочу у тебя забирать радость самостоятельного написания программы .
AquaSky
0 / 0 / 0
Регистрация: 09.10.2008
Сообщений: 18
11.10.2008, 23:49  [ТС]     Поменять местами все соседние группы из двух битов в заданом беззнаковом длинном числе #5
я не прошу написать мне программу я прошу задать мне правильное направление поиска информации. Я смотрел битовые операции и не нашел там выхода из ситуации =\\ мб плохо искал =)
igor_nf
118 / 12 / 1
Регистрация: 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);
 
}
Как видишь есть привязка к длине машинного слова. Если писать без привязки, без логических операций не обойтись, т. к. вычисление длины машинного слова будет в рантайме.
AquaSky
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 не понимаю =\

Не редактирует предыдущий пост =\\
AquaSky
0 / 0 / 0
Регистрация: 09.10.2008
Сообщений: 18
15.10.2008, 01:27  [ТС]     Поменять местами все соседние группы из двух битов в заданом беззнаковом длинном числе #8
ап
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.10.2008, 23:58     Поменять местами все соседние группы из двух битов в заданом беззнаковом длинном числе
Еще ссылки по теме:

C++ Поменять местами соседние слова в тексте
C++ Поменять местами элементы соседние массива
C++ Прочитать текстовый файл и поменять в каждой строке местами соседние слова
C++ Для каждой строки таблицы поменять местами соседние элементы
C++ Поменять в строке местами соседние слова (fstream)

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

Или воспользуйтесь поиском по форуму:
qwone
8 / 8 / 1
Регистрация: 18.08.2008
Сообщений: 129
15.10.2008, 23:58     Поменять местами все соседние группы из двух битов в заданом беззнаковом длинном числе #9
смотри http://www.cyberforum.ru/newreply.ph...uote=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);
 
}
Yandex
Объявления
15.10.2008, 23:58     Поменять местами все соседние группы из двух битов в заданом беззнаковом длинном числе
Ответ Создать тему
Опции темы

Текущее время: 11:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru