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

Ошибка в коде - C++

Восстановить пароль Регистрация
 
Илья Поповнин
0 / 0 / 0
Регистрация: 05.08.2012
Сообщений: 6
05.08.2012, 18:46     Ошибка в коде #1
класс big нужен для хранения чисел в двоичном виде

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
#include <iostream>
 
using namespace std;
 
class big
{
    public:
        bool digit[65536];
        big()
        {
            for(int d = 0; d < 65536; d++)
                digit[d] = 0;
        }
        void increaseDigit(unsigned int d)
        {
            //cout<<digit[d]<<endl;;
            if(digit[d] == 0)
            {
                //cout<<d<<endl;
                digit[d] = 1;
            }
            if(digit[d] == 1 && d <65536)
            {
                //cout<<d<<endl;
                digit[d] = 0;
                increaseDigit(d+1);
            }
        }
};
 
int main()
{
    big a;
    for(int s = 1; s <= 16; s++)
    {
        a.increaseDigit(0);
    }
    for(int s = 1; s <= 8; s++)
    {
        cout<<a.digit[s];
    }
    return 0;
}
собственно получаю следующее:

root@bt:~/Desktop/C++/big# g++ big.cpp
root@bt:~/Desktop/C++/big# ./a.out
00000000root@bt:~/Desktop/C++/big#

в чем ошибка не пойму, должно же получиться 16 в двоичной системе счисления, записанное с конца
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.08.2012, 18:46     Ошибка в коде
Посмотрите здесь:

Ошибка в коде C++
Ошибка в коде.. C++
Ошибка в коде C++ C++
ошибка в коде C++
C++ Ошибка в коде
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Intel~lect
 Аватар для Intel~lect
135 / 124 / 2
Регистрация: 03.07.2012
Сообщений: 355
05.08.2012, 18:56     Ошибка в коде #2
C++
1
2
3
4
5
6
7
8
9
10
11
           if(digit[d] == 0)
            {
                //cout<<d<<endl;
                digit[d] = 1;
            }
            if(digit[d] == 1 && d <65536)
            {
                //cout<<d<<endl;
                digit[d] = 0;
                increaseDigit(d+1);
            }
Здесь небольшая ошибка. Если digit[d] равно 0 то оно сначала поменяется на 1. И сразу же в следующем операторе проверке условия if(digit[d] == 1 && d <65536) опять изменится на 0.

C++
1
2
3
4
5
6
7
8
9
10
11
12
            if(digit[d] == 0)
            {
                //cout<<d<<endl;
                digit[d] = 1;
            }
            else
            if(digit[d] == 1 && d <65536)
            {
                //cout<<d<<endl;
                digit[d] = 0;
                increaseDigit(d+1);
            }
Илья Поповнин
0 / 0 / 0
Регистрация: 05.08.2012
Сообщений: 6
05.08.2012, 21:27  [ТС]     Ошибка в коде #3
спасибо! return решил проблему

Добавлено через 2 часа 19 минут
А еще подскажите пожалуйста почему на объект типа big выделяется не ~65536 бит, а гораздо больше(оперативки 1280mb, а уместилось всего два big по 268435456 бит т.е. 32mb)?и если знаете решение данной проблемы опишите его тоже, пожалуйста.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.08.2012, 21:36     Ошибка в коде #4
Цитата Сообщение от Илья Поповнин Посмотреть сообщение
спасибо! return решил проблему

Добавлено через 2 часа 19 минут
А еще подскажите пожалуйста почему на объект типа big выделяется не ~65536 бит, а гораздо больше(оперативки 1280mb, а уместилось всего два big по 268435456 бит т.е. 32mb)?и если знаете решение данной проблемы опишите его тоже, пожалуйста.
Только не 65536 бит, а 65536 байт. Как определяли?
Илья Поповнин
0 / 0 / 0
Регистрация: 05.08.2012
Сообщений: 6
05.08.2012, 21:44  [ТС]     Ошибка в коде #5
А почему байт?Разве на bool(true/false) выделяется байт?и тогда как выделять память побитово?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.08.2012, 21:53     Ошибка в коде #6
Цитата Сообщение от Илья Поповнин Посмотреть сообщение
Разве на bool(true/false) выделяется байт?
Да.

Цитата Сообщение от Илья Поповнин Посмотреть сообщение
и тогда как выделять память побитово?
Никак. А зачем?
Илья Поповнин
0 / 0 / 0
Регистрация: 05.08.2012
Сообщений: 6
05.08.2012, 21:57  [ТС]     Ошибка в коде #7
Цитата Сообщение от alsav22 Посмотреть сообщение

Никак. А зачем?
нужно работать с очень большими числами(>1E8 знаков(в десятичной системе счисления)), причем в двоичной системе гораздо удобнее
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.08.2012, 22:09     Ошибка в коде #8
Для того, чтобы определить сколько байт занимает переменная, объект класса, тип данных, можно применять sizeof().
C++
1
2
cout << sizeof(bool) << endl;
cout << sizeof(big) << endl;
Добавлено через 3 минуты
Цитата Сообщение от Илья Поповнин Посмотреть сообщение
нужно работать с очень большими числами
Работайте. В чём проблема?
Илья Поповнин
0 / 0 / 0
Регистрация: 05.08.2012
Сообщений: 6
05.08.2012, 22:16  [ТС]     Ошибка в коде #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Для того, чтобы определить сколько байт занимает переменная, объект класса, тип данных, можно применять sizeof().
C++
1
2
cout << sizeof(bool) << endl;
cout << sizeof(big) << endl;
Добавлено через 3 минуты
Работайте. В чём проблема?
оперативки не хватает=( 8 гигов нужно
но все равно хотел покупать новый комп, программу пишу для себя
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.08.2012, 22:19     Ошибка в коде #10
У вас один объект класса big - это одно число? Не пойму вот это:
Цитата Сообщение от Илья Поповнин Посмотреть сообщение
два big по 268435456 бит
Откуда у вас в big взялось 268435456 бит? 65536 * 8 = 524288.
Илья Поповнин
0 / 0 / 0
Регистрация: 05.08.2012
Сообщений: 6
05.08.2012, 22:22  [ТС]     Ошибка в коде #11
Цитата Сообщение от alsav22 Посмотреть сообщение
У вас один объект класса big - это одно число?
да, нужно 3 числа
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.08.2012, 22:30     Ошибка в коде #12
Одно число (объект big) 64 килобайта. И куда что не помещается? И вы не ответили, как у вас в big оказалось 268435456 бит? В 512 раз больше, чем размер объекта класса big.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2012, 22:38     Ошибка в коде
Еще ссылки по теме:

Ошибка в коде C++
C++ Ошибка в коде
C++ Ошибка в коде

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

Или воспользуйтесь поиском по форуму:
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
05.08.2012, 22:38     Ошибка в коде #13
Попробуйте работать с битами внутри байтов.

Допустим, нам нужно size бит. Допустим, архитектура хранит 8 бит на байт (самое распространенное).
Тогда количество памяти, нужной для хранения size бит составит ((size / 8) + 1) байт. +1, поскольку число бит может быть не кратно 8 бит.

Допустим, у нас есть массив с именем storage размером [size / 8 + 1] байт (unsigned char storage[size / 8 + 1]).
Получить, установлен ли бит n, можно с помощью вычисления позиции этого бита в массиве и применения операции битовой конъюнкции & по следующей формуле
(storage[n / 8] & (1 << (n % 8))) >> 8
Установить бит n можно при помощи тех же вычислений и операции дизъюнкции:
storage[n / 8] |= 1 << (n % 8)

Следующий пример кода несколько сложнее, поскольку использует динамический базовый тип для хранения, но использует те же формулы выше.
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
53
54
55
56
57
#include <iostream>
#include <stdexcept>
 
template <class StorageItemType = unsigned int,
  size_t numberOfBitsPerItem = sizeof(StorageItemType) * 8>
class SimpleBitSet {
 public:
  SimpleBitSet(size_t size)
    : size_(size),
      storage_(new StorageItemType[size / numberOfBitsPerItem + 1]) {
    clear();
  }
  ~SimpleBitSet() {
    delete [] storage_;
  }
  void clear() {
    for (size_t i = 0; i < sizeof(storage_); ++i)
      storage_[i] = 0;
  }
  size_t getSize() const {
    return size_;
  }
  void setBit(size_t n) {
    storage_[n / numberOfBitsPerItem] |= 1 << (n % numberOfBitsPerItem);
  }
  void unSetBit(size_t n) {
    storage_[n / numberOfBitsPerItem] &= !(1 << (n % numberOfBitsPerItem));
  }
  void xorBit(size_t n, bool value) {
    storage_[n / numberOfBitsPerItem] ^= (value << (n % numberOfBitsPerItem));
  }
  bool getBit(size_t n) const {
    return storage_[n / numberOfBitsPerItem] & (1 << (n % numberOfBitsPerItem));
  }
  void addBit(size_t n) {
    if (n >= getSize()) throw(std::out_of_range("Bit is out of range."));
    if (getBit(n)) addBit(n + 1);
    xorBit(n, 1);
  }
 private:
  size_t size_;
  StorageItemType *storage_;
};
 
std::ostream &operator<<(std::ostream &stream, const SimpleBitSet<> &bitSet) {
  for (int i = bitSet.getSize() - 1; i >= 0; --i)
    stream << bitSet.getBit(i);
  return stream;
}
 
int main(int argc, char **argv) {
  SimpleBitSet<> bitSet(32);
  for (size_t i = 0; i < bitSet.getSize(); ++i) {
    bitSet.addBit(0);
    std::cout << bitSet << std::endl;
  }
}
Yandex
Объявления
05.08.2012, 22:38     Ошибка в коде
Ответ Создать тему
Опции темы

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