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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.02.2009, 10:14   #1
kesha2008
Пользователь
 
Регистрация: 23.02.2009
Сообщений: 12
По умолчанию Работа с битами

Прошу помощи знающих. Читал литературу, не могу понять некоторые моменты.
Задание:
Ввести последовательность из 8 символов. В их двоичном представлении заменить:
если старший бит 1, заменить его на 0;
если старший бит 0, заменить его и младший бит единицами.
Вывести исходную последовательность и ее восьмеричные коды; преобразованную последовательность и ее восьмеричные коды.

Код:
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
	clrscr();
	char simv[8];
	cout << "Vvedite 8 simvolov\n";
	for(int i=0;i<8;++i)
	{
		cin >> simv[i];
	}
	cout << "Kody simvolov\n";
	for(i=0;i<8;++i)
	{
		cout << oct << (int)simv[i];
		cout << "  ";
	}
	getch();
	return 0;
}
Ввёл 8 символов, вывел их восьмеричные коды.... Теперь не могу понять как числа представить в двоичной форме, чтобы проделать операции изменения битов... И как маску накладывать?

Последний раз редактировалось kesha2008; 23.02.2009 в 10:18.
kesha2008 вне форума Ответить с цитированием
Старый 24.02.2009, 01:28   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

может понадобится...

Код:
int* NumToBit (int n,int *bit) // perevod chisla v bitovoe predstavlenie

{
	int n1=n;
	for(int c=7;c>=0;c--)

	{
		if(n1%2)
		{ bit[c]=1; }
		else
		{ bit[c]=0; }
		n1=n1/2;	
	}

	cout<<"Ischodnoe chislo :\n";
	cout<<n<<" = ";
	for(int i=0;i<8;i++)

	{
		cout<<" "<<bit[i];
	}

	return bit;
}

int BitToNum(int *bit) // perevod v bitov v chislo

{
	int res=0;
	float k=2;

	for(int c=7,i=0;c>=0;c--,i++)

	{
		res+=(bit[c]*pow(k,i));
	}

	return res;
}
counter вне форума Ответить с цитированием
Старый 24.02.2009, 12:05   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Старший бит идёт с номером 7. нумерация справа. Чтобы определить, что старший бит у нас 1, нужно выполнить побитовое логическое И.
код_символа & 10000000
Если это выражение вернёт истину, значит старший бит у нас равен 1.
10000000 - число в двоичной системе, состоящее из 8 бит. Нужно проверить 7-ой бит, так что в этом числе 7-ой бит у нас равен 1.
Если бы нам нужно было проверить третий бит, то было бы уже число 00001000.
В си двоичных констант кажется нет, так что придется это число переводить к основанию 10/8/16.
будет как-то так:
Код:
char c = 'a';
char new_c;
if (c & 0x80) // 0x80 - это и есть 10000000, только в 16-ричной системе
{
  // Старший бит равен 1
  new_c = c & 0x7F;  // Устанавливаем старший бит в 0. 0x7F - Это число 01111111
  // или так
  new_c = c ^ 0x80; // Используем исключающее или с той же константой, что использовали для проверки
}
ЗЫ. написанное не проверял, так что где-то с константами мог начудить, но сути дела это не меняет
ЗЫ2. Если совсем ничего непонятно, изучайте булеву алгебру
pu4koff вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача. Работа с псевдослучайными последовательностями (ПСП). Работа с цветом. 0101 Помощь студентам 3 17.12.2009 23:57