Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> работа с числами unsigned long, и хранение информации о них 
V
    Опции темы
s_a_s_h_a
Дата 26.5.2011, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 261
Регистрация: 20.7.2004
Где: Петрозаводск

Репутация: нет
Всего: 1



Объясните, пожалуйста, что происходит в этом коде 

Код

unsigned long* table; 
 
void reset_bit(long bit_number) { 
            long i = bit_number / 32; 
            long p = bit_number % 32; 
            table[i] = table[i] & (unsigned long)(~(1 << (int)p)); 
} 
 
bool get_bit(long bit_number) 
        { 
            long i = bit_number / 32; 
            long p = bit_number % 32; 
            if ( (table[i] & (unsigned long)(1 << (int)p)) != 0 ) 
                return true; 
            return false; 
        } 
 
int main() {
            ...
        unsigned long cnt = (unsigned long)(N/32);
        table = new unsigned long[cnt]; 

            for ( i = 0; i <= cnt; i++ ) 
                table[i] = 0xffffffff; 

            for ( i =1; i < N; i+= 2 ) 
                reset_bit(i); 

            for ( i = 1; i <= N; i++ ) 
                if ( get_bit(i) ) 
                    cout << i << " "; 
}

Мне понятно, что код выводит список четных чисел. Меня интересует работа с битами, что происходит в функциях get_bit и reset_bit? Есть проблема работы с числами unsigned long и нужно хранить информацию о них. Чтобы памяти хватило, нужно с битами работать, а я ничего в этом не понимаю :(
PM MAIL   Вверх
baldina
Дата 26.5.2011, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 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 секунд
Цитата(s_a_s_h_a @  26.5.2011,  10:08 Найти цитируемый пост)
код выводит список четных чисел.

код записывает в 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 - число с одним установленным битом


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1854 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.