Что не так с моей маскировкой?

  1. Я должен создать n массивов битов, n не является константой! Почему программа выдает мусор вместо моих массивов?

  2. Как записать полученные массивы в файл, чтобы их там было немного?

Пример:

class bits {
int *m;
int razm;
int num;
int N;
public:
bits(int r,int NN) { N=NN; razm=r; num=0; m=new int[N*razm]; }
~bits() {delete(m);}
void add() { m[num/32]|=(1>>(num%32)); num++;}
bool read(int n,int bit)
{
return m[(razm*n-bit)/32]&(1>>((razm*n-bit)%32)); }
};

void main()
{
bits x(8,10000);
char ch[100]={"11111122223334445698"};
for (int i=0;i<100;i++)
{
for(int j=0;j<8;j++)
if(ch[i]&(1<<j))
x.add();
}

for (int i=0;i<100;i++)
{
for(int j=0;j<8;j++) { if(x.read(i,j)) cout << "1"; else cout << "0"; }
cout << "\n";
}
}

1

Решение

Вы сдвигаетесь вправо

(1>>(num%32))
(1>>((razm*n-bit)%32))

где вы должны сместить влево. Сдвиг вправо дает 0, за исключением случаев, когда остаток равен 0.

1

Другие решения

Ваш new int[N*razm] Выражение не инициализирует память, поэтому ваш битовый массив начинается с неопределенного содержимого (возможно, случайного мусора). Если вы хотите значение инициализированного массива в нули, измените его на new int[N*razm]()Обратите внимание на завершающие скобки.

0