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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2009, 12:38   #1
JeyKip
Форумчанин
 
Регистрация: 18.09.2009
Сообщений: 133
Радость Побитовое кодирование

Помогите, пожалуйста, решить задачу на С++:
"Декодировать последовательность битов по следующему правилу:
00 - #
01 - @
10 - $
11 - &

Каждые 2 бита заменять соответствующим символом. Получаемые символы последовательности выводиить на печать."

Ввод числа в 10СС и вывод его в 2СС я сделал:

Код:
#include <iostream>
using namespace std;
void main ()
{
	setlocale(0,"");
	int a,i;
	cout<<"Введите число\n";
	cin>>a;
for (i=0; i<8; i++)
{
	if (a&0x80) cout<<"1";
	else cout<<"0";
	a<<=1;
	
}
А дальше не знаю...КТО ОТЗОВЕТСЯ, ЗАРАНЕЕ ОГРОМНОЕ СПАСИБО!!!

Последний раз редактировалось Sazary; 18.09.2009 в 18:30.
JeyKip вне форума Ответить с цитированием
Старый 18.09.2009, 16:12   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Во-первых, здесь предполагается, что размер int равен одному биту, что вообще говоря не гарантировано. Я бы предложил использовать
Код:
while (a)
{
if (a & 1) cout << "1";
else cout << "0";
a >>= 1;
}
И, например,
Код:
string s;
while (a)
{
b = (a & 3);
a >>= 1;
switch (b)
{
case 0: s += "#"; break;
//...
}
}
а затем вывести строку в обратном порядке (честно говоря, давно не имел дело с битовыми операторами, мог что-то напутать, но суть вы, надеюсь, уловили!)
Да, и, конечно, в первом примере опять же у меня получилось, что число пишется задом наперед, ну да мне лень исправлять...
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же

Последний раз редактировалось Гром; 18.09.2009 в 16:24.
Гром вне форума Ответить с цитированием
Старый 18.09.2009, 16:48   #3
rangerx
Пользователь
 
Регистрация: 30.05.2009
Сообщений: 46
По умолчанию

Цитата:
Сообщение от JeyKip Посмотреть сообщение
Помогите, пожалуйста, решить задачу на С++:
"Декодировать последовательность битов по следующему правилу:
00 - #
01 - @
10 - $
11 - &

Каждые 2 бита заменять соответствующим символом. Получаемые символы последовательности выводиить на печать."
Код:
#include <iostream>

int main()
{
    const int SIZE = 4;
    const char symbols[SIZE] = {'#', '@', '$', '&'};

    unsigned int val = 0;
    std::cout << "Input value: ", std::cin >> val;

    //32 бита взято в надежде, что так оно и есть )))
    unsigned int index = 0;
    for (int i = 31;  i > 0 ; i-=2)
    {
        if( (val & (1 << i)) ) index |= (1 << 1);
        if( (val & (1 << i-1)) ) index |= (1 << 0);

        std::cout << symbols[index] << ' ';
        index = 0;
    }
    return 0;
}
rangerx вне форума Ответить с цитированием
Старый 18.09.2009, 19:48   #4
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
if( (val & (1 << i)) ) index |= (1 << 1);
if( (val & (1 << i-1)) ) index |= (1 << 0);
index = val >> i & 3;
Цитата:
//32 бита взято в надежде, что так оно и есть )))
Не есть хорошо.

Последний раз редактировалось Somebody; 18.09.2009 в 19:50.
Somebody вне форума Ответить с цитированием
Старый 19.09.2009, 13:59   #5
JeyKip
Форумчанин
 
Регистрация: 18.09.2009
Сообщений: 133
По умолчанию

Всем, кто принял участие в решении этой задачи, еще раз огромное спасибо...Ниже представлен код этой программы в рабочем варианте..!! Может быть, кому-то пригодится:
Код:
#include <iostream>
using namespace std;
void main ()
{
	setlocale(0,"");
	int b,a,c=128,d=64;
	cout<<"Введите число\n";
	cin>>a;
	cout<<"Представление числа в 2-СС:\n";
	for (b=128; b>0; b/=2)
	{
		if (a&b) cout<<"1";
		else cout<<"0";
	}
cout<<"\n";
cout<<"Символьное кодирование:\n";
for (b=0; b<4; b++,a<<=2)

	{
				if (((a&c)!=128)&&((a&d)!=64))
			cout<<"#";
		else
	{
		if (((a&c)!=128)&&(a&d))
			cout<<"@";
		else
{
		if ((a&c)&&((a&d)!=64))
			cout<<"$";
		else

	{
		if ((a&c)&&(a&d))
			cout<<"&";
	}
		
}
		}}
for (b=0; b<2; b++)
		cin.get();
	}

Последний раз редактировалось Sazary; 20.09.2009 в 02:44.
JeyKip вне форума Ответить с цитированием
Старый 19.09.2009, 15:02   #6
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

М, небольшие замечания:
Объявляйте константы соответствующим образом:
const int c = 128;
const int d = 64;
И желательно отдельно, а то пока я нашел, где же они определены...

Еще - поскольку (a & c) == 128 либо (a & c) == 0, и аналогично с (a & d), то проще и нагляднее будет
Код:
int e = (a & c) + (a & d);
switch(e)
{
case 0: cout << "#"; break;
case 64: cout << "@"; break;
case 128: cout << "$"; break;
case 192: cout << "&"; break;
}
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 19.09.2009, 15:08   #7
rangerx
Пользователь
 
Регистрация: 30.05.2009
Сообщений: 46
По умолчанию

Цитата:
index = val >> i & 3;
Да, так по идее должно работать(не проверял). Просто лень было думать, написал, что первое пришло в голову )
Цитата:
Не есть хорошо.
Никто и не говорит, что это хорошо. Исправить несложно.

Последний раз редактировалось rangerx; 19.09.2009 в 15:27.
rangerx вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Побитовое умножение в Excel-2003 Matanya Microsoft Office Excel 2 28.08.2009 11:13
Кодирование asil Помощь студентам 1 02.05.2009 20:48
Кодирование. Blizzz Общие вопросы Delphi 5 19.01.2009 18:28
ADPCM кодирование Eugene881118 Помощь студентам 1 08.07.2008 14:36
Кодирование Mss_Smith Помощь студентам 3 17.04.2007 14:46