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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Templates. (concrete inheritance). question to destructor implementation http://www.cyberforum.ru/cpp-beginners/thread633347.html
Есть вот такой вот проект. Идея в том том что конкретный класс наследуется от темплейта. Как в таком случае ПРАВИЛЬНО + ГРАМОТНО реализовать дестрактор у конкретного класса ??? PointArray::PointArray(int size) : Array<Point>(size) { } PointArray::~PointArray()
C++ Составить правило как правильно составить условие для If выдать сообщения если введены не цифры http://www.cyberforum.ru/cpp-beginners/thread633343.html
string и функция _itow C++
Всем привет! Ребята, не могу понять как мне использовать string и функцию _itow Вот код wstring positionclient = _itow( findclient.inumberhome,positionclient.c_str(),10 ); Пробовал использовать вот так, тоже не получается
Виртуальные фукнции C++
Здравствуйте, уважаемые форумчане! Не получается реализовать следующее: Есть базовый класс Array с полями: массив типа unsigned char и поле для хранения количества элементов у текущего объекта-массива. Реализовать в классе Array виртуальную функцию поэлементного сложения массивов. Теперь дочерние классы: Класс Hex содержит число в шестнадцатеричной системе исчисления, при этом оно вводится в...
C++ Опять про реализацию класса в отдельном файле http://www.cyberforum.ru/cpp-beginners/thread633295.html
Допустимо ли следующее? есть проект в Visual Studio 2010. в нем следующие файлы: main.cpp - собссно программа MyClass.h - интерфейс класса MyClass MyClass.cpp - реализация класса MyClass MySubClass.h - интерфейс класса MySubClass (производного от MyClass) MySubClass.cpp - реализация класса MySubClass
C++ Размер вектора и вывод элементов Объясните почему в функции print размер передаваемого вектора v.size()=0? Соответсвенно не работает цикл for в print(). #include <iostream> #include <vector> using namespace std; void print(vector<int> v, string s) { cout << s << '\n'; cout << v.size() << '\n'; подробнее

Показать сообщение отдельно
lemegeton
2918 / 1347 / 134
Регистрация: 29.11.2010
Сообщений: 2,721
05.08.2012, 22:38     Ошибка в коде
Попробуйте работать с битами внутри байтов.

Допустим, нам нужно 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;
  }
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru