Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Здесь нужно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Название темы включает слова - "Помогите", "Спасите", "Срочно"
Название темы не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте >>>правила <<< и заново правильно создайте тему.
 
Опции темы
Старый 29.04.2009, 10:07   #1
phobos
Пользователь
 
Аватар для phobos
 
Регистрация: 19.04.2007
Сообщений: 35
Стрелка Битовые операции: как узнать значение отдельного бита?

Доброго времени суток всем!
Возник такой вопрос: как выдрать значение отдельного бита из переменной (например типа int)? Т.е. когда я задаю int a=13, то в битовом представлении получается а=0000 0000 0000 1101. Нужно считать все 0 и 1 и занести их в массив для дальнейшей обработки. Заранее благодарен )

ЗЫ. Знаком с битовыми операциями типа >>, <<, ^, &, |, но имхо их недостаточно для решения данной задачи.
phobos вне форума  
Старый 29.04.2009, 10:44   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,538
По умолчанию

Достаточно. Смещаете вправо число и смотрите что в нулевом бите посредством & и так пока число не станет равно нулю. Если я еще не забыл логические операции, то как-то так будет:
Код:
n = 0; // номер проверяемого бита
while (a != 0)
{
  a >> 1;
  if (a & 1)
  {
    // бит №n установлен в единицу
  }
  else
  {
    // бит №n нулевой
  }
  ++n;
}
pu4koff вне форума  
Старый 29.04.2009, 19:22   #3
Pashan
Пользователь
 
Регистрация: 18.03.2009
Сообщений: 89
По умолчанию

Только там не a >> 1, а a >>= 1, а то зациклится
Pashan вне форума  
Старый 29.04.2009, 21:04   #4
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

можно еще вот так:
Код:
union BIT_FIELD {
	struct BITS {
		unsigned b0: 1;
		unsigned b1: 1;
		unsigned b2: 1;
		unsigned b3: 1;
		unsigned b4: 1;
		unsigned b5: 1;
		unsigned b6: 1;
		unsigned b7: 1;
	} bits;
	unsigned char value;
};
после установки значение в переменной value, структура bits заполнится битами. в некоторых случаях это удобный метод
vvviperrr вне форума  
Старый 29.04.2009, 21:12   #5
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,538
По умолчанию

Если только компилятор структуру не решит оптимизировать и не сделает b0 и другие размером в 4 байта
pu4koff вне форума  
Старый 30.04.2009, 09:31   #6
phobos
Пользователь
 
Аватар для phobos
 
Регистрация: 19.04.2007
Сообщений: 35
По умолчанию

Спасибо за ответы )
pu4koff, код немного подправил: строчку "a >>= 1;" следует дописать после проверки условия (if-else), иначе в массиве теряется значение нулевого бита.
phobos вне форума  
Закрытая тема
Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Битовые операции, проблемы Sashko Общие вопросы C/C++ 2 27.03.2009 18:28
битовые операции, Pascal TOSAgrk Помощь студентам 2 02.02.2009 18:41
Битовые операции DrAlexx2121 Assembler - Ассемблер 4 14.06.2008 22:26
Битовые операции LEX.darnica Помощь студентам 14 23.12.2007 20:40
Битовые операции zetrix Assembler - Ассемблер 5 15.12.2006 12:08