Форум программистов, компьютерный форум CyberForum.ru

BitArray. Целочисленная реализация. - C++

Восстановить пароль Регистрация
 
inoto
0 / 0 / 0
Регистрация: 08.11.2011
Сообщений: 3
11.11.2011, 13:53     BitArray. Целочисленная реализация. #1
Везде нахожу примеры как битовый массив хранится в строке. А мне нужно хранение в инте. Вопщем, код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class BitArray
{
 private:
 
   unsigned SizeBits;
   unsigned SizeIntCount;
   unsigned *Data;
   unsigned Mask;
...
 
BitArray::BitArray(unsigned n)
{
   if (n < 1)
      n = 1;
   Mask = 1;
   SizeBits = n;
   float f = (float)n / (8 * sizeof(int)) + 0.999;
   SizeIntCount = (int)f;
   Data = new unsigned [SizeIntCount];
 
   unsigned bits = 0;
   for (int i = 0; i < SizeIntCount; i++)
   {
      Mask = 1;
      for (int j = 0; j < (8 * sizeof(int)); j++)
      {
     bits++;
     *Data = (*Data | Mask ? 1 : 0); //вот тут что-то не так я думаю, но не могу понять что?
     Mask<<=1;
     if (bits == SizeBits)
        break;
      }
   }
}
}
Второй день ломаю голову...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.11.2011, 13:53     BitArray. Целочисленная реализация.
Посмотрите здесь:

C++ Целочисленная арифметика
Целочисленная арифметика C++
C++ по целочисленная арифметике
Целочисленная матрица C++
C++ целочисленная матрица
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.11.2011, 14:02     BitArray. Целочисленная реализация. #2
inoto, представьте unsigned как набор байт:

00 00 00 00

их как набор бит:

0000 0000 0000 0000 0000 0000 0000 0000

и почитайте про поразрядные операции.
inoto
0 / 0 / 0
Регистрация: 08.11.2011
Сообщений: 3
11.11.2011, 14:22  [ТС]     BitArray. Целочисленная реализация. #3
talis, мб вы дадите мне более наглядную подсказку?)
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.11.2011, 14:52     BitArray. Целочисленная реализация. #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <string>
 
#define FLAG_0    1
#define FLAG_1    2
#define FLAG_2    4
#define FLAG_3    8
#define FLAG_4   16
#define FLAG_5   32
#define FLAG_6   64
#define FLAG_7  128
 
int main( )
{
    unsigned flags = 0;
 
    std::string cmd;
 
    while( std::cout << '>' && std::cin >> cmd && cmd != "quit" )
    {
        if( cmd == "set" )
        {
            short flag_n;
            std::cin >> flag_n;
            flags |= (1 << flag_n);
        }
        else if( cmd == "unset" )
        {
            short flag_n;
            std::cin >> flag_n;
            flags &= ~(1 << flag_n);
        }
        else if( cmd == "out" )
        {
            if( flags & FLAG_0 )
               std::cout << "first bit is set\n";
 
            if( flags & FLAG_3 )
               std::cout << "fourth bit is set\n";
 
            for( unsigned short i = 1; i != 0x8000; i <<= 1 )
               std::cout << (flags & i ? '1' : '0');
 
            std::cout << '\n';
        }
        else
            std::cout << "what?\n"
    }
 
 
    return 0;
}
<< - операция битового сдвига числа влево
>> - операция битового сдвига числа вправо

| - поразрядное ИЛИ
& - поразрядное И
~ - НЕ (инверсия битов)
inoto
0 / 0 / 0
Регистрация: 08.11.2011
Сообщений: 3
11.11.2011, 15:16  [ТС]     BitArray. Целочисленная реализация. #5
talis, да, это понятно что каждый считает себя познавшим очень многое, но... что если кол-во бит хранится в указателе и память выделяется динамически?
C++
1
unsigned *Data = new unsigned [CountInts];
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
11.11.2011, 15:31     BitArray. Целочисленная реализация. #6
inoto, а что надо сделать-то? Из кода совсем не понятно, что делается...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2011, 15:32     BitArray. Целочисленная реализация.
Еще ссылки по теме:

C++ Целочисленная арифметика
C++ Целочисленная арифметика
C++ Целочисленная арифметика в С++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.11.2011, 15:32     BitArray. Целочисленная реализация. #7
Цитата Сообщение от inoto Посмотреть сообщение
что если кол-во бит хранится в указателе и память выделяется динамически?
Вы хотите сказать, что массив бит реально представляет собой массив unsigned int (выделенный динамически)? Тогда вам для выставления/сброса/проверки бита нужно вычислять позицию его инта в массиве и затем позицию бита в инте.

Если sizeof( unsigned ) == 4 байта (32 бита), то:
Бит № 74 имеет позицию: (74 / 32) = 2,3125 = 2-й элемент массива, в нём бит № (74 % 32) = 10. Сооветственно, для его выставления вам нужно сделать: Data[2] |= (1 << 10).

Ну или записать туда формулы расчёта:

Data[target/sizeof(unsigned)] |= (1 << (target % sizeof(unsigned) ) );

Где target - номер нужного бита, unsigned - тип элемента массива Data.

Не по теме:


Это арифметика класс так за четвёртый.

Цитата Сообщение от inoto Посмотреть сообщение
talis, да, это понятно что каждый считает себя познавшим очень многое
Да, и давайте не будем переходить на личности. В конце концов, вопроса или задачи в вашем первом посте я не увидел. Умейте формулировать свои мысли.

Yandex
Объявления
11.11.2011, 15:32     BitArray. Целочисленная реализация.
Ответ Создать тему
Опции темы

Текущее время: 09:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru