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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.07.2009, 04:42   #1
("")(Э_Є)("")
Форумчанин
 
Регистрация: 26.01.2009
Сообщений: 112
По умолчанию Битовые операции

Мне срочно нужно установить конкретный бит не затирая соседей
Так я читаю бит:
Код:
// f - файл.
short int i =  READ_IO_WORD(wordIndx,f);
i = i<<(15-bitIndx);
i = abs(i>>(15));
Так я записываю с затиранием:
Код:
//bit единица или ноль - хвост удалять не нужно.
bit = bit<<bitIndx;
WRITE_IO_WORD(wordIndx, bit,f);
Я думаю о чем-то таком:
Цитата:
inline void writeBit(Int32 wordIndx, Int32 bitIndx, unsigned short int bit, FILE *f) {

short int dst = READ_IO_WORD(wordIndx,f);

bit = bit<<bitIndx;
short int top = dst>>(bitIndx + 1);
top = top<<(bitIndx + 1);
short int btm = dst<<(15-bitIndx + 1);
btm = btm>>(15-bitIndx + 1);
dst = top + bit + btm;

WRITE_IO_WORD(wordIndx, bit,f);

}
Также принимаются версии с использованием Vector<bool> и вообще всё что будет работать

но работоспособном

Спасибо.


PS. Вот на всякий случай две мои основные функции:
Код:
inline System::String^ readBit(Int32 wordIndx, Int32 bitIndx,FILE *f) {

		short int i =  READ_IO_WORD(wordIndx,f);
		
		i = i<<(15-bitIndx);
		i = abs(i>>(15));

		return gcnew System::String(System::Convert::ToString(i));
	}

inline void writeBit(Int32 wordIndx, Int32 bitIndx, unsigned short int bit, FILE *f) {

	  bit = bit<<bitIndx;
	  WRITE_IO_WORD(wordIndx, bit,f);

	}

Последний раз редактировалось ("")(Э_Є)(""); 03.07.2009 в 05:18.
("")(Э_Є)("") вне форума Ответить с цитированием
Старый 03.07.2009, 09:29   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Код:
	short int i = 200; // Исходное число
	char str[100];
	itoa(i, str, 2);
	cout << str << endl; // вывод на экран в 2-ой системе
	short int ii = 1; // не забываем инициализировать именно единицей
	int bit = 0;
	cin >> bit; // ввод номера бита, который нужно установить
	ii <<= bit; // создаем "маску" для его установки
	itoa(ii, str, 2);
	cout << str << endl; // вывод "маски" на экран
	i |= ii; // установка бита посредством побитового или
	itoa(i | ii, str, 2);
	cout << str << endl; // результат
и главное не забывать, что биты нумеруются справа-налево, начиная с нуля
pu4koff вне форума Ответить с цитированием
Старый 03.07.2009, 18:32   #3
("")(Э_Є)("")
Форумчанин
 
Регистрация: 26.01.2009
Сообщений: 112
По умолчанию

Спасибо большое. Суровый олдскул, аж мурашки по коже, сохраню для потомков...
С or понятно, а как присвоить биту 0 ? Как я понимаю, or возвращает 1 если хоть бы где-то этот один есть? То есть, если я хочу установить бит в 0, я потом могу еще применить какойнить XOR к результату с той же маской или как ?

PS. Постоянно путаю, биты нумируються справа налево относительно меня или экрана ? )))

Да и еще отдельное спасибо за "Итою", ценю наглядность

Последний раз редактировалось ("")(Э_Є)(""); 03.07.2009 в 18:48.
("")(Э_Є)("") вне форума Ответить с цитированием
Старый 03.07.2009, 19:06   #4
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Если я правильно понял,
Код:
n |= (1 << i); // установить i-й бит
n &= ~(1 << i) // сбросить i-й бит
n = (bit << bitIndex) | (n & ~(1 << bitIndex)); // bitIndex-й бит = bit
// Получается типа:
WRITE_IO_WORD(wordIndx, (bit << bitIndex) | (READ_IO_WORD(wordIndx,f) & ~(1 << bitIndex)), f); // вроде так
Somebody вне форума Ответить с цитированием
Старый 03.07.2009, 19:15   #5
("")(Э_Є)("")
Форумчанин
 
Регистрация: 26.01.2009
Сообщений: 112
По умолчанию

+стопиццот! Работает!

Копипаст, копипаст, копипаст.....

Всем спасибо.
("")(Э_Є)("") вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Битовые операции, проблемы Sashko Общие вопросы C/C++ 2 27.03.2009 17:28
битовые операции, Pascal TOSAgrk Помощь студентам 2 02.02.2009 17:41
Битовые операции DrAlexx2121 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 14.06.2008 22:26
Битовые операции LEX.darnica Помощь студентам 14 23.12.2007 19:40
Битовые операции zetrix Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 15.12.2006 11:08