|
@ -1,17 +1,30 @@ |
|
|
#pragma once |
|
|
#pragma once |
|
|
#include <cstddef> |
|
|
#include <cstddef> |
|
|
|
|
|
|
|
|
#include "storm/utility/macros.h" |
|
|
#include "storm/utility/macros.h" |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* \return 2^n - 1 |
|
|
|
|
|
*/ |
|
|
inline size_t smallestIntWithNBitsSet(size_t n) { |
|
|
inline size_t smallestIntWithNBitsSet(size_t n) { |
|
|
static_assert(sizeof(size_t) == 8, "size_t has wrong size."); |
|
|
static_assert(sizeof(size_t) == 8, "size_t has wrong size."); |
|
|
STORM_LOG_ASSERT(n < 64, "Input is too large."); // TODO fix this for 32 bit architectures! |
|
|
|
|
|
|
|
|
STORM_LOG_ASSERT( |
|
|
|
|
|
n < 64, |
|
|
|
|
|
"Input is too large."); // TODO fix this for 32 bit architectures! |
|
|
if (n == 0) return 0; |
|
|
if (n == 0) return 0; |
|
|
return (1 << n) - 1; |
|
|
return (1 << n) - 1; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* The next bit permutation in a lexicographical sense. |
|
|
|
|
|
* |
|
|
|
|
|
* Example: 00010011, 00010101, 00010110, 00011001, |
|
|
|
|
|
* 00011010, 00011100, 00100011, and so forth |
|
|
|
|
|
* |
|
|
|
|
|
* From https://graphics.stanford.edu/~seander/bithacks.html#NextBitPermutation |
|
|
|
|
|
*/ |
|
|
inline size_t nextBitPermutation(size_t v) { |
|
|
inline size_t nextBitPermutation(size_t v) { |
|
|
if (v == 0) return static_cast<size_t>(0); |
|
|
if (v == 0) return static_cast<size_t>(0); |
|
|
// From https://graphics.stanford.edu/~seander/bithacks.html#NextBitPermutation |
|
|
|
|
|
size_t t = (v | (v - 1)) + 1; |
|
|
size_t t = (v | (v - 1)) + 1; |
|
|
return t | ((((t & -t) / (v & -v)) >> 1) - 1); |
|
|
return t | ((((t & -t) / (v & -v)) >> 1) - 1); |
|
|
} |
|
|
} |