![]() |
|
Модераторы: bsa |
![]()
|
|
| s_a_s_h_a |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 261 Регистрация: 20.7.2004 Где: Петрозаводск Репутация: нет Всего: 1 |
Объясните, пожалуйста, что происходит в этом коде
Мне понятно, что код выводит список четных чисел. Меня интересует работа с битами, что происходит в функциях get_bit и reset_bit? Есть проблема работы с числами unsigned long и нужно хранить информацию о них. Чтобы памяти хватило, нужно с битами работать, а я ничего в этом не понимаю :( |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
есть некий массив table, представляющий собой массив N бит. для работы с битами (снять/проверить) используются функции reset_bit и get_bit соответственно.
битовых массивов нет в С/С++, поэтому используется массив unsigned long размером N/32 (32 - число бит в long на 32-х разрядной платформе) функции reset_bit и get_bit для своей работы по bit_number (который в диапазоне 0..N-1) вычисляют i - индекс в массиве table и p - порядковый номер бита в элементе table[p]. проверить, установлен ли бит, можно операцией & (AND) - это делает get_bit стереть бит можно операцией &, где вторым аргументом число, с нужным битом, установленным в 0. получить такое число, зная номер бита p можно операцией ~(1<<p) - устанавливаем бит p и инвертируем. Добавлено через 2 минуты и 17 секунд код записывает в table чередующийся битовый массив ....1010101010 и затем последовательно выводит значения всех бит Добавлено через 9 минут и 35 секунд итого, reset_bit и get_bit используют три битовые операции: 1. создать число, с установленным битом p: x = 1<<p например, если p = 2, то x=4 (00000000000000000000000000000100) 2. инвертировать биты y = ~x например, если x=4, то y= (1111111111111111111111111111011) 3. логическое AND z = x & y например, если x=(11100), a y= (11000), то z =(11000) этой операцией можно проверить один бит в x, если y - число с одним установленным битом |
|||
|
||||
![]()
|
| Правила форума "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. |