![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
kuvshinka |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 386 Регистрация: 27.4.2008 Репутация: нет Всего: нет |
допустим у меня есть переменная типа short:
1.а как из этой 16-ти разрядной(битной) переменной выделить (записать в отдельную переменную) допустим 5,6 (или только допустим 7-ой, или крайние - 15-ый и 0-ой) разряды (биты)? 2. и наоборот - в, например, 12-ый бит переменной parametr записать "1"? в Си (С++) читала про операторы сдвига >>, << и &, но до конца не поняла как ими пользоваться и прошу объяснить (дать маленький комментарий к ответу) конкретно на данном примере...или может в кути есть какие-то свои методы под это дело??? |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
Это сообщение отредактировал(а) borisbn - 8.6.2011, 09:56 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
afiskon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 31.3.2011 Где: Россия, Москва Репутация: нет Всего: 4 |
Еще в си есть union и битсеты - можно ими.
|
|||
|
||||
borisbn |
|
||||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
ага, забыл.
или из предыдущего примера
или из предыдущего примера
Это сообщение отредактировал(а) borisbn - 8.6.2011, 09:53 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||||||||
|
|||||||||||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
kuvshinka, подобные вопросы следует задавать в разделе для новичков. Данный раздел по кроссплатформенным библиотекам.
|
|||
|
||||
kuvshinka |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 386 Регистрация: 27.4.2008 Репутация: нет Всего: нет |
мда....ну назначение операций << и >> я знаю - побитовый сдвиг влево и вправо...а что делает (для чего нужна) операция "&" и assert?
|
|||
|
||||
borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
& - побитовое "И"
assert нужен для того, чтобы убедиться в правильности/истинности выражения. В отладочной сборке при попадании в assert ложного выражения будет выдано сообщение с именем файла исходника и номером строки, где assert не сработал. Часто используется для того, чтобы убедиться в том, что переданный указатель не нулевой.
согласись, что если p нулевой, то программа не должна делать запись/чтение по нему... -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
kuvshinka |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 386 Регистрация: 27.4.2008 Репутация: нет Всего: нет |
ммм...
допустим есть short- число A 1. если мне надо выделить из нее, допустим, 5-8 биты в отдельную переменную X, то это будет вроде как
то есть надо сдвинуться вправо на 5 разрядов и...как трактовать умножение (&) на число 0xF (все единицы в 4-х выделяемых разрядах), вообще зачем его (&) здесь использовать? разъясните пож-та как-то "графически" что ли... 2. почему, если надо выделить разряд(ы), начиная со старшего (15-го), то достаточно только использовать сдвиг >> и не надо &? если выделяю старшие 2 разряда (15 и 14), то это будет наверное так:
то есть достаточно (?) сдвинуть все вправо на 14 "ненужных" разрядов и не надо (...)&0x3... |
||||
|
|||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
трактовать так: обнулить все биты кроме четырех младших. 0xF = 0000000000001111 В принципе, если число 16-разрядное, то не надо, потому-что там и так все биты уже обнулены. Но во-первых, если завтра вы решите перейти на 32-разрядную версию, то программа ваша перестанет правильно работать. а во-вторых &3 не помешает в любом случае, даже в 16-разрядной. Так что лучше использовать ее всегда. Добавлено через 1 минуту и 50 секунд borisbn, я это заберу, если не возражаете. пригодиться. ![]() Добавлено через 4 минуты и 5 секунд тьфу-ты. опять мягкий знак.... ![]() |
|||
|
||||
volatile |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Тут надо уточнить, если число 16-разрядное, и беззнаковое В случае если используется знаковое (signed) число, а в вашем первом вопросе именно знаковое и используется, то делать битовый энд (&) обязательно, потому-что при сдвиге вправо, для знакового числа, копируется самый старший (знаковый) бит. kuvshinka, короче.
![]() Это сообщение отредактировал(а) volatile - 9.6.2011, 00:36 |
||||
|
|||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
>я это заберу, если не возражаете.
LGPL ![]() -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Не надо трактовать & как умножение! Преподаватели называют логическую операцию И умножением только потому, что: 1. в логике только два числа: 0 и 1 (false и true) 2. поведение & полностью соответствует умножению для этого набора чисел (повторяю 0 и 1), но если у тебя возможно 1 & 10, то это уже не умножение!!! У тебя же используется побитовое И. Итак, твой код: x = (A >> 5) & 0x0f; Битовая математика:
|
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
kuvshinka |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 386 Регистрация: 27.4.2008 Репутация: нет Всего: нет |
borisbn:
Ваш пример я вроде поняла - битовое поле и объединение этого поля с short-переменной
а как этот пример адаптировать под массив считываемых данных (в данном случае типа short)? (то есть можно ли также использовать массив битовых полей+массив short данных)??? как такой пример будет выглядеть? |
|||
|
||||
borisbn |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
конечно.
или так
запись точно также
или так
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||||||
|
|||||||||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |