-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathTools.h
106 lines (89 loc) · 2.7 KB
/
Tools.h
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/*
* Collection of basic tools and defines
*/
#ifndef _TOOLS_H_
#define _TOOLS_H_
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <ctime>
#include <climits>
#define W (CHAR_BIT*sizeof(unsigned long))
#ifndef WW
#define WW (W*2)
#endif
#ifndef Wminusone
#define Wminusone (W-1)
#endif
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef ulong
#define ulong unsigned long
#endif
#define myminofthree(x,y,z) (x)<(y)?((x)<(z)?(x):(z)):(y)<(z)?(y):(z)
class Tools
{
private:
static time_t startTime;
public:
static void StartTimer();
static double GetTime();
static uchar * GetRandomString(unsigned, unsigned, unsigned &);
static void PrintBitSequence(ulong *, ulong);
static uchar * GetFileContents(char *, ulong =0);
static ulong * bp2bitstream(uchar *);
static unsigned FloorLog2(ulong);
static unsigned CeilLog2(ulong);
static unsigned bits (ulong);
static inline void SetField(ulong *A, register unsigned len, register ulong index, register ulong x)
{
ulong i = index * len / W,
j = index * len - i * W;
ulong mask = (j+len < W ? ~0lu << (j+len) : 0)
| (W-j < W ? ~0lu >> (W-j) : 0);
A[i] = (A[i] & mask) | x << j;
if (j + len > W)
{
mask = ((~0lu) << (len + j - W));
A[i+1] = (A[i+1] & mask)| x >> (W - j);
}
}
static inline ulong GetField(ulong *A, register unsigned len, register ulong index)
{
register ulong i = index * len / W,
j = index * len - W * i,
result;
if (j + len <= W)
result = (A[i] << (W - j - len)) >> (W - len);
else
{
result = A[i] >> j;
result = result | (A[i+1] << (WW - j - len)) >> (W - len);
}
return result;
}
static inline ulong GetVariableField(ulong *A, register unsigned len, register ulong index)
{
register ulong i=index/W, j=index-W*i, result;
if (j+len <= W)
result = (A[i] << (W-j-len)) >> (W-len);
else {
result = A[i] >> j;
result = result | (A[i+1] << (WW-j-len)) >> (W-len);
}
return result;
}
static inline void SetVariableField(ulong *A, register unsigned len, register ulong index, register ulong x) {
ulong i=index/W,
j=index-i*W;
ulong mask = (j+len < W ? ~0lu << (j+len) : 0)
| (W-j < W ? ~0lu >> (W-j) : 0);
A[i] = (A[i] & mask) | x << j;
if (j+len>W) {
mask = ((~0lu) << (len+j-W));
A[i+1] = (A[i+1] & mask)| x >> (W-j);
}
}
};
#endif