Nebula
Toggle main menu visibility
Loading...
Searching...
No Matches
bit.h
Go to the documentation of this file.
1
#pragma once
2
//------------------------------------------------------------------------------
12
#include "
core/types.h
"
13
14
namespace
Util
15
{
16
17
//------------------------------------------------------------------------------
20
constexpr
uint64_t
21
SetBit
(uint64_t mask, uint8_t bit)
22
{
23
return
mask | (1ULL << bit);
24
}
25
26
//------------------------------------------------------------------------------
29
constexpr
bool
30
HasBit
(uint64_t mask, uint8_t bit)
31
{
32
return
mask & (1ULL << bit);
33
}
34
35
//------------------------------------------------------------------------------
38
constexpr
uint32_t
39
SetBit
(uint32_t mask, uint8_t bit)
40
{
41
return
mask | (1 << bit);
42
}
43
44
//------------------------------------------------------------------------------
47
constexpr
bool
48
HasBit
(uint32_t mask, uint8_t bit)
49
{
50
return
mask & (1 << bit);
51
}
52
53
//------------------------------------------------------------------------------
56
constexpr
uint16_t
57
SetBit
(uint16_t mask, uint8_t bit)
58
{
59
return
mask | (1 << bit);
60
}
61
62
//------------------------------------------------------------------------------
65
constexpr
bool
66
HasBit
(uint16_t mask, uint8_t bit)
67
{
68
return
mask & (1 << bit);
69
}
70
71
//------------------------------------------------------------------------------
74
constexpr
int64_t
75
SetBit
(int64_t mask, uint8_t bit)
76
{
77
return
mask | (1LL << bit);
78
}
79
80
//------------------------------------------------------------------------------
83
constexpr
bool
84
HasBit
(int64_t mask, uint8_t bit)
85
{
86
return
mask & (1LL << bit);
87
}
88
89
//------------------------------------------------------------------------------
92
constexpr
int32_t
93
SetBit
(int32_t mask, uint8_t bit)
94
{
95
return
mask | (1 << bit);
96
}
97
98
//------------------------------------------------------------------------------
101
constexpr
bool
102
HasBit
(int32_t mask, uint8_t bit)
103
{
104
return
mask & (1 << bit);
105
}
106
107
//------------------------------------------------------------------------------
110
constexpr
int16_t
111
SetBit
(int16_t mask, uint8_t bit)
112
{
113
return
mask | (1 << bit);
114
}
115
116
//------------------------------------------------------------------------------
119
constexpr
bool
120
HasBit
(int16_t mask, uint8_t bit)
121
{
122
return
mask & (1 << bit);
123
}
124
125
//------------------------------------------------------------------------------
128
constexpr
uint32_t
129
CountBits
(uint32_t i)
130
{
131
i = i - ((i >> 1) & 0x55555555);
132
i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
133
return
(((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
134
}
135
136
//------------------------------------------------------------------------------
140
template
<
typename
T>
141
inline
void
HashCombine
(uint32_t& s,
const
T& v)
142
{
143
std::hash<T> h;
144
s ^= h(v) + 0x9e3779b9 + (s << 6) + (s >> 2);
145
}
146
147
//------------------------------------------------------------------------------
150
inline
uint
151
PopCnt
(
uint
value)
152
{
153
return
_mm_popcnt_u32(value);
154
}
155
156
//------------------------------------------------------------------------------
159
inline
uint64_t
160
PopCnt
(uint64_t value)
161
{
162
return
_mm_popcnt_u64(value);
163
}
164
165
//------------------------------------------------------------------------------
168
inline
uint
169
FirstBitSetIndex
(
uint
value)
170
{
171
#if __WIN32__
172
DWORD count = 0;
173
_BitScanForward(&count, value);
174
#else
175
int
count = __builtin_ctz(value);
176
#endif
177
return
count;
178
}
179
180
//------------------------------------------------------------------------------
183
inline
uint
184
FirstBitSetIndex
(uint64_t value)
185
{
186
#if __WIN32__
187
DWORD count = 0;
188
_BitScanForward64(&count, value);
189
#else
190
int
count = __builtin_ctzll(value);
191
#endif
192
return
count;
193
}
194
195
//------------------------------------------------------------------------------
198
inline
uint
199
LastBitSetIndex
(
uint
value)
200
{
201
#if __WIN32__
202
DWORD count = 0;
203
_BitScanReverse(&count, value);
204
#else
205
int
count = 31 - __builtin_clz(value);
206
#endif
207
return
count;
208
}
209
210
//------------------------------------------------------------------------------
213
inline
uint
214
LastBitSetIndex
(uint64_t value)
215
{
216
#if __WIN32__
217
DWORD count = 0;
218
_BitScanReverse64(&count, value);
219
#else
220
int
count = 63 - __builtin_clzll(value);
221
#endif
222
return
count;
223
}
224
225
//------------------------------------------------------------------------------
228
inline
uint
229
CountLeadingZeroes
(
uint
value)
230
{
231
#if __WIN32__
232
DWORD count = 0;
233
_BitScanReverse(&count, value);
234
count = 31 - count;
235
#else
236
int
count = __builtin_clz(value);
237
#endif
238
return
count;
239
}
240
241
//------------------------------------------------------------------------------
244
inline
uint
245
CountLeadingZeroes
(uint64_t value)
246
{
247
#if __WIN32__
248
DWORD count = 0;
249
_BitScanReverse64(&count, value);
250
count = 63 - count;
251
#else
252
int
count = __builtin_clzll(value);
253
#endif
254
return
count;
255
}
256
257
//------------------------------------------------------------------------------
260
inline
uint
261
CountTrailingZeroes
(
uint
value)
262
{
263
#if __WIN32__
264
DWORD count = 0;
265
_BitScanForward(&count, value);
266
#else
267
int
count = __builtin_ctz(value);
268
#endif
269
return
count;
270
}
271
272
//------------------------------------------------------------------------------
275
inline
uint
276
CountTrailingZeroes
(uint64_t value)
277
{
278
#if __WIN32__
279
DWORD count = 0;
280
_BitScanForward64(&count, value);
281
count = count;
282
#else
283
int
count = __builtin_ctzll(value);
284
#endif
285
return
count;
286
}
287
288
//------------------------------------------------------------------------------
291
inline
uint
292
Lsb
(
uint
value,
byte
bit)
293
{
294
uint
mask = value & ~((1 << bit) - 1);
295
#if __WIN32__
296
DWORD count = 0;
297
_BitScanForward(&count, mask);
298
#else
299
int
count = __builtin_ctz(mask);
300
#endif
301
return
mask ? count : 0xFFFFFFFF;
302
}
303
304
//------------------------------------------------------------------------------
307
inline
uint
308
BitmaskConvert
(
uint
mask,
const
uint
* table,
const
uint
numEntries = 0xFFFFFFFF)
309
{
310
uint
ret = 0x0;
311
uint
usageFlags = mask;
312
uint
flagIndex = 0;
313
while
(usageFlags != 0x0 && flagIndex < numEntries)
314
{
315
if
(usageFlags & (1 << flagIndex))
316
{
317
ret |= table[flagIndex];
318
}
319
usageFlags &= ~(1 << flagIndex);
320
flagIndex++;
321
}
322
return
ret;
323
}
324
325
}
// namespace Util
326
Util
A quad tree designed to return regions of free 2D space.
Definition
String.cs:6
Util::HasBit
constexpr bool HasBit(uint64_t mask, uint8_t bit)
Definition
bit.h:30
Util::SetBit
constexpr uint64_t SetBit(uint64_t mask, uint8_t bit)
Definition
bit.h:21
Util::BitmaskConvert
uint BitmaskConvert(uint mask, const uint *table, const uint numEntries=0xFFFFFFFF)
Definition
bit.h:308
Util::Lsb
uint Lsb(uint value, byte bit)
Definition
bit.h:292
Util::PopCnt
uint PopCnt(uint value)
Definition
bit.h:151
Util::FirstBitSetIndex
uint FirstBitSetIndex(uint value)
Definition
bit.h:169
Util::CountLeadingZeroes
uint CountLeadingZeroes(uint value)
Definition
bit.h:229
Util::HashCombine
void HashCombine(uint32_t &s, const T &v)
Combine hashes.
Definition
bit.h:141
Util::CountTrailingZeroes
uint CountTrailingZeroes(uint value)
Definition
bit.h:261
Util::CountBits
constexpr uint32_t CountBits(uint32_t i)
Definition
bit.h:129
Util::LastBitSetIndex
uint LastBitSetIndex(uint value)
Definition
bit.h:199
types.h
uint
unsigned int uint
Definition
types.h:33
code
foundation
util
bit.h
Generated on
for Nebula. Dark theme by
Tilen Majerle
. All rights reserved.