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

Быстрый подсчет количества бит - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ задача сорт и поиск бульбашка http://www.cyberforum.ru/cpp-beginners/thread1020528.html
надо по сортировать числа 12 22 15 55 11 21 12 31 13 51 55 15 с помощью буль башки в отсортированном массиве после этова найти максимальное число и минимальное в массиве! также найти определенный...
C++ Написать программу с функцией, вычисляющей расстояние между двумя точками на плоскости Пожалуйста Помогите сделать лабу, нужно что-бы я сам задавал координаты точек на плоскости. http://www.cyberforum.ru/cpp-beginners/thread1020526.html
C++ Отправка письма на email
Здорова господа!!! Пишу щас программку которая должна отсылать письма на email, но ничего не получается. От что набрасал:#include <winsock.h> int main() { cout <<"Rabota c SOCETAMI"<<endl;...
в последней строке файла записаны два слова, переписать в выходной файл лишь те строки в которых есть хотя бы одно из этих слов C++
помогите пожалуйста с задачей: в последней строке файла записаны два слова, переписать в выходной файл лишь те строки в которых есть хотя бы одно из этих слов :help:
C++ приведение NULL к char http://www.cyberforum.ru/cpp-beginners/thread1020499.html
можно ли так писать, если getpwd(login) возвращает NULL? pwds = (char*) getpwd(login);
C++ Запись в массив объекты класса (vector) // oop_laba2_2cpp: определяет точку входа для консольного приложения. //Вариант 6 //Объект – директория. // //Включает в себя //массив //файлов (имя, расширение, размер). // //Методы –... подробнее

Показать сообщение отдельно
stlex
0 / 0 / 0
Регистрация: 27.11.2013
Сообщений: 8
28.11.2013, 08:35  [ТС]
Вот окончательный вариант моего класса. Убрал лишние вложенные вызовы функций, и теперь BitCount() приблизился по скорости к &= , SetBit() и прочим. А быстрее всего работает автогенерированный operator=() - вот что значит оптимизация компилятора! Думаю, тут только на asm можно что-то существенно оптимизировать.
Может, код пригодится кому-то.
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
58
59
60
61
62
63
64
65
template<int N>
class BitMap
{   
public:
   BitMap()
   {
      Clear();
   }
   inline void Clear()
   {
      ZeroMemory( myMap, N * sizeof(__int32) );
   }
   inline bool GetBit( int n )
   {
      if( ( 1 << ( n % BITS_COUNT_INT ) ) & myMap[ n / BITS_COUNT_INT ] )
         return true;
      else
         return false;
   }
   inline void SetBit( int n )
   {
      myMap[ n / BITS_COUNT_INT ] |=  1 << ( n % BITS_COUNT_INT );
   }
   inline void ClearBit( int n )
   {
      myMap[ n / BITS_COUNT_INT ] &= ~( 1 << ( n % BITS_COUNT_INT ) );
   }
   int BitCount()
   {
      static unsigned __int8 mas[0x10000];
      static bool init = InitMas( mas );
      int res = 0;
      for( int i = 0; i < 11; ++i )
         res += mas[ (unsigned __int16)(myMap[i] >> 16) ] + mas[ (unsigned __int16)(myMap[i] & 0xFFFF) ];
      return res;
   }
   BitMap<N>& operator&=( const BitMap<N>& other )
   {
      for( int i = 0; i < N; ++i )
         myMap[i] &= other.myMap[i];
      return *this;
   }
   BitMap<N>& operator|=( const BitMap<N>& other )
   {
      for( int i = 0; i < N; ++i )
         myMap[i] |= other.myMap[i];
      return *this;
   }
private:
   static bool InitMas( unsigned __int8 *mas )
   {
      for( int i = 0; i < 0x10000; ++i )
      {
         unsigned __int8 count = 0;
         for( int tmp = i; tmp > 0; tmp = tmp / 2 )
         {
            if( tmp % 2 )
               ++count;
         }
         mas[i] = count;
      }
      return true;
   }
   __int32 myMap[N];
};
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru