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

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

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

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

11.10.2008, 13:54. Просмотров 1594. Ответов 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++
Написать программу, которая считывает текст с клавиатуры и выводит его на экран, меняет местами каждые соседние слова (Borland MS-DOS)

Поменять местами элементы соседние массива - C++
В массиве из 100 целых чисел поменять местами соседние элементы (1-й со 2-м, 3-й по 4-м и т.д.). Правильно ли я зделал? #include...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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++
Написать программу, которая считывает текст из файла и выводит его в другой файл и на экран, меняя местами каждые два соседних слова. ...

Поменять в строке местами соседние слова (fstream) - C++
Имеется строка, нужно поменять местами слова: 1-ое со 2-ым, 3-е с 4-ым и т.д помогите придумать код, вообще не понимаю

Массив: поменять местами соседние строки двумерного массива - C++
Написать программу, которая случайным образом заполняет двумерный массив размером 6х6 цифрами от 0 до 10. Воспользовавшись одномерным ...

В заданом одномерном масиве целого типа поменять местами следующие два элемента: первый минимальный и последний максимальный - C++
Помогите пожалуйста, нужен полный текст программы. Заранее благодарен.


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

Или воспользуйтесь поиском по форуму:
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     Поменять местами все соседние группы из двух битов в заданом беззнаковом длинном числе
Ответ Создать тему
Опции темы

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