Skip to content

Commit f009368

Browse files
committed
Merge branch 'Turlikov'
2 parents ca0d6a0 + 682dbd4 commit f009368

File tree

12 files changed

+932
-79
lines changed

12 files changed

+932
-79
lines changed
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
// Тема: Сравнение методов вычисления числа единиц в двоичном представлении числа
2+
3+
// TODO:
4+
// Методично описать каждый подход к вычислению числа единиц в двоичном представлении числа
5+
// Измерить быстродействие по времени
6+
// Построить график зависимости времени работы от числа бит в числе для всех алгоритмов
7+
// - алгоритм с делением
8+
// - алгоритм с побитовыми операциями
9+
// - алгоритм со вспомогательной таблицей
10+
11+
#include <iostream>
12+
#include <chrono>
13+
#include <cstdlib>
14+
15+
using namespace std;
16+
using namespace std::chrono;
17+
18+
#define ITERS 2000000
19+
20+
char arr_small[16] = {
21+
0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4
22+
};
23+
24+
char arr_big[256] = {
25+
0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
26+
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
27+
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
28+
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
29+
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
30+
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
31+
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
32+
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
33+
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
34+
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
35+
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
36+
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
37+
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
38+
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
39+
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
40+
4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8,
41+
};
42+
43+
unsigned char count_ones_1(unsigned long long n) {
44+
unsigned char w = 0;
45+
while (n) {
46+
w += n % 2;
47+
n = n / 2;
48+
}
49+
return w;
50+
}
51+
52+
unsigned char count_ones_2(unsigned long long n) {
53+
unsigned char w = 0;
54+
while (n > 0) {
55+
w += n & 1;
56+
n = n >> 1;
57+
}
58+
return w;
59+
}
60+
61+
unsigned char count_ones_3(unsigned long long n) {
62+
unsigned char w = 0;
63+
while (n > 0) {
64+
w += arr_small[n & 15];
65+
n = n >> 4;
66+
}
67+
return w;
68+
}
69+
70+
unsigned char count_ones_4(unsigned long long n) {
71+
unsigned char w = 0;
72+
while (n > 0) {
73+
w += arr_big[n & 255];
74+
n = n >> 8;
75+
}
76+
return w;
77+
}
78+
79+
void benchmark(string str, unsigned char (*cum)(uint64_t)) {
80+
cout << endl << str << endl;
81+
for (int bit = 0; bit < 64; bit++) {
82+
int64_t n = (1LL << bit); // + rand() % (1LL << bit);
83+
auto t1 = high_resolution_clock::now();
84+
for (int i = 0; i < ITERS; i++) cum(n);
85+
auto t2 = high_resolution_clock::now();
86+
int64_t duration = duration_cast<microseconds>(t2 - t1).count();
87+
cout << "bit " << bit + 1
88+
<< ": dur " << (double) duration / ITERS
89+
<< " us" << endl;
90+
}
91+
}
92+
93+
int main() {
94+
benchmark("func: 1", count_ones_1);
95+
benchmark("func: 2", count_ones_2);
96+
benchmark("func: 3", count_ones_3);
97+
benchmark("func: 4", count_ones_4);
98+
return 0;
99+
}

0 commit comments

Comments
 (0)