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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.06.2012, 19:22   #1
Chelovekpredel
Пользователь
 
Регистрация: 31.03.2012
Сообщений: 33
По умолчанию Побитовый операторы в си. Проблемы с задачей.

Недавно начал изучать си и толкнулся с некоторыми проблемами с побитовыми операторами.
Хотелось бы увидеть код задачи с соответствующими комментариями.


Вот и сама задача.
Напишите функцию invert ( х , р, п), возвращающую
значение х с инвертированными п битами, начиная с позиции р (остальные
биты не изменяются).

Заранее спасибо.
Chelovekpredel вне форума Ответить с цитированием
Старый 15.06.2012, 19:33   #2
Ezhuk
Форумчанин
 
Регистрация: 09.10.2010
Сообщений: 217
По умолчанию

А в чем проблема?
Ёж птица гордая, пока не пнешь не полетит.
Ezhuk вне форума Ответить с цитированием
Старый 15.06.2012, 20:34   #3
Chelovekpredel
Пользователь
 
Регистрация: 31.03.2012
Сообщений: 33
По умолчанию

Впринципе не знаю как написать.
Вот и прошу написать мне код.
Chelovekpredel вне форума Ответить с цитированием
Старый 15.06.2012, 21:33   #4
Ezhuk
Форумчанин
 
Регистрация: 09.10.2010
Сообщений: 217
По умолчанию

Код:
int invert(int x,int n,int p){
	int mask=0;	
	for(int i=0;i<n;i++)	mask=mask<<1;
	mask=mask<<(sizeof(int)*8-n-p+1);
	return x^=mask;
}
Ёж птица гордая, пока не пнешь не полетит.
Ezhuk вне форума Ответить с цитированием
Старый 16.06.2012, 14:07   #5
Chelovekpredel
Пользователь
 
Регистрация: 31.03.2012
Сообщений: 33
По умолчанию

А можно это еще и объяснить?
Chelovekpredel вне форума Ответить с цитированием
Старый 16.06.2012, 16:32   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Ezhuk, не соглашусь с вами.
Код:
unsigned int invert(unsigned int x,unsigned int n,unsigned int p){
	unsigned int mask=0;
	for(int i=0;i<n;i++)	mask=(mask<<1)+1;
	mask=mask<<(sizeof(int)*8-n-p+1);
	return x^=mask;
}
А то у вас маска состоит из нулей
Chelovekpredel, цикл формирует маску из единиц (n единиц).
Потом делается сдвиг так, чтобы маска располагалась на тех же местах, что и заменяемые биты.
Потом делается xor, который обращает биты по маске.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 16.06.2012, 17:22   #7
Chelovekpredel
Пользователь
 
Регистрация: 31.03.2012
Сообщений: 33
По умолчанию

Все понял, спасибо.
Chelovekpredel вне форума Ответить с цитированием
Старый 16.06.2012, 17:29   #8
Ezhuk
Форумчанин
 
Регистрация: 09.10.2010
Сообщений: 217
По умолчанию

Цитата:
int invert(int x,int n,int p){
int mask=0;
for(int i=0;i<n;i++) mask=(mask++)<<1;
mask=mask<<(sizeof(int)*8-n-p+1);
return x^=mask;
}
Точно, инкремент забыл.
Ёж птица гордая, пока не пнешь не полетит.
Ezhuk вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с задачей в VB Blugins Помощь студентам 0 27.10.2011 23:59
Побитовый сдвиг Belii09878 Помощь студентам 10 02.02.2010 14:46
проблемы с головой - ОПЕРАТОРЫ УСЛОВИЯ Asira Помощь студентам 6 22.12.2009 16:39
C++ побитовый сдвиг KOLYTFR Помощь студентам 1 03.06.2009 22:42