powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как заменить биты?
12 сообщений из 12, страница 1 из 1
Как заменить биты?
    #32420687
tors
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть переменная типа WORD.
Как мне заминить, например, 6 и 7 биты старшего байта?
И где можно почитать по теме?
...
Рейтинг: 0 / 0
Как заменить биты?
    #32420753
Фотография Alkagor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А логические операторы на что?...
...
Рейтинг: 0 / 0
Как заменить биты?
    #32420775
_Konst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если есть число
WORD numb;

BYTE h_bt = HIBYTE(numb);
Маска для шестого бита:
BYTE mask = 1<<(6-1);
Его значение
BYTE bit_6 = ((h_bt & mask) != 0) ? 1 : 0;

Сбросить значение 6-го бита
h_bt ^= h_bt & mask;

flip
bit_6 = !bit_6;

Поместить в число
h_bt |= bit_6 << (6-1);

окончательно
numb = MAKEWORD(l_bt, h_bt);

Чего-то я вот все это понаписал и подумал - может можно проще??
Например, можно использовать битовые поля...
...
Рейтинг: 0 / 0
Как заменить биты?
    #32420950
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
компилятор не гарантирует способ размещения битовых полей (хотя все они размещают их правильно)

--------
можно поиграть, если уж на то пошло

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
const struct {
	unsigned operator[] (unsigned i) const { return  1 <<i; }

	static void set(unsigned& where, unsigned mask) { where|=mask; }

	static void reset(unsigned& where, unsigned mask) { where&=~mask; }

	template<typename TBool>
	static void set(unsigned& where, unsigned mask, TBool value) 
	{ if(value) set(where, mask); else reset(where, mask); }

	static unsigned check(unsigned where, unsigned mask) { return where&mask ;}
} bits;


int main(int argc, _TCHAR* argv[])
{
	unsigned i= 0 , j= 31 , k= 30 ; // старшие биты
	bits.set(i, bits[j] | bits[k]);
	printf( "%d %d" , i, bits.check(i, bits[ 3 ]));
	return  0 ;
}


выглядит сурово и навороченно... но стоит откомпилить релиз + дебаг + вся оптимизация и посмотреть что там получается...
в общем все инлайны хорошо работают
...
Рейтинг: 0 / 0
Как заменить биты?
    #32421309
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дайте и мне шашкой помахать!

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
set(WORD &where, int bit){where |=  1 <<bit;}

reset(WORD &where, int bit){where &= ~( 1 <<bit);}

main(int argc, _TCHAR* argv[])
{
	WORD w= 0 ;
	set(w, 8 + 5 ); //  6 -й бит поставили
	set(w, 8 + 6 ); //  7 -й бит поставили
	printf( "%d" , w);
	return  0 ;
}
...
Рейтинг: 0 / 0
Как заменить биты?
    #32422214
_Konst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И еще можно попытаться использовать класс stl
bitset
:))
...
Рейтинг: 0 / 0
Как заменить биты?
    #32422379
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тогда уже и std::vector<bool>

зачастую они это интересно частично специализируют
...
Рейтинг: 0 / 0
Как заменить биты?
    #32422677
Кубанец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А не проще ли битовую маску одеть AND'ом и потом OR'ом поработать. В одну строчку дёшево и сердито
...
Рейтинг: 0 / 0
Как заменить биты?
    #32422682
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а так не итнерестно
вообше можно и на астме решить енту задачку :)
____
...
Рейтинг: 0 / 0
Как заменить биты?
    #32423499
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
специально смотрел на 7.1

при компиляции в релиз он выдает одинаковый код что с применением классов, что с применением просто логических операций в одной строке.

понимаешь, классы, в отличии от макросов или непосредственных логических операторов можно сделать типобезопасными, с проверкой в compile-time и debug-run-time, чтобы, скажем, кто-то в short не выставлял 31-й бит и не искал бы долго потом ошибку...
...
Рейтинг: 0 / 0
Как заменить биты?
    #32423962
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 CEMb

кстати, заметь, я в своих примерах ставлю маску, а не бит...

объяснить, почему?
...
Рейтинг: 0 / 0
Как заменить биты?
    #32425821
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, и так понятно, но у меня нагляднее :)
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как заменить биты?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]