OpenTTD Source
12.0-beta2
|
Go to the documentation of this file.
10 #ifndef BITMATH_FUNC_HPP
11 #define BITMATH_FUNC_HPP
32 static inline uint
GB(
const T x,
const uint8 s,
const uint8 n)
34 return (x >> s) & (((T)1U << n) - 1);
57 template <
typename T,
typename U>
58 static inline T
SB(T &x,
const uint8 s,
const uint8 n,
const U d)
60 x &= (T)(~((((T)1U << n) - 1) << s));
82 template <
typename T,
typename U>
83 static inline T
AB(T &x,
const uint8 s,
const uint8 n,
const U i)
85 const T mask = ((((T)1U << n) - 1) << s);
86 x = (T)((x & ~mask) | ((x + (i << s)) & mask));
102 template <
typename T>
103 static inline bool HasBit(
const T x,
const uint8 y)
105 return (x & ((T)1U << y)) != 0;
120 template <
typename T>
121 static inline T
SetBit(T &x,
const uint8 y)
123 return x = (T)(x | ((T)1U << y));
136 #define SETBITS(x, y) ((x) |= (y))
150 template <
typename T>
151 static inline T
ClrBit(T &x,
const uint8 y)
153 return x = (T)(x & ~((T)1U << y));
166 #define CLRBITS(x, y) ((x) &= ~(y))
180 template <
typename T>
183 return x = (T)(x ^ ((T)1U << y));
188 extern const uint8
_ffb_64[64];
200 #define FIND_FIRST_BIT(x) _ffb_64[(x)]
218 if ((value & 0xFF) == 0) {
238 template <
typename T>
241 return value &= (T)(value - 1);
250 template <
typename T>
260 for (num = 0; value != 0; num++) {
261 value &= (T)(value - 1);
273 template <
typename T>
276 return value != 0 && (value & (value - 1)) == 0;
285 template <
typename T>
288 return (value & (value - 1)) == 0;
300 template <
typename T>
301 static inline T
ROL(
const T x,
const uint8 n)
303 if (n == 0)
return x;
304 return (T)(x << n | x >> (
sizeof(x) * 8 - n));
316 template <
typename T>
317 static inline T
ROR(
const T x,
const uint8 n)
319 if (n == 0)
return x;
320 return (T)(x >> n | x << (
sizeof(x) * 8 - n));
328 template <
typename Tbitpos = u
int,
typename Tbitset = u
int>
331 typedef Tbitpos value_type;
332 typedef value_type *pointer;
333 typedef value_type &reference;
334 typedef size_t difference_type;
335 typedef std::forward_iterator_tag iterator_category;
337 explicit Iterator(Tbitset bitset) : bitset(bitset), bitpos(
static_cast<Tbitpos
>(0))
342 bool operator==(
const Iterator &other)
const
344 return this->bitset == other.bitset && (this->bitset == 0 || this->bitpos == other.bitpos);
346 bool operator!=(
const Iterator &other)
const {
return !(*
this == other); }
347 Tbitpos operator*()
const {
return this->bitpos; }
348 Iterator & operator++() { this->Next(); this->Validate();
return *
this; }
355 while (this->bitset != 0 && (this->bitset & 1) == 0) this->Next();
359 this->bitset =
static_cast<Tbitset
>(this->bitset >> 1);
365 Iterator begin() {
return Iterator(this->bitset); }
366 Iterator end() {
return Iterator(
static_cast<Tbitset
>(0)); }
367 bool empty() {
return this->begin() == this->end(); }
373 #if defined(__APPLE__)
378 # define BSWAP32(x) (static_cast<uint32>(CFSwapInt32(x)))
379 # define BSWAP16(x) (static_cast<uint16>(CFSwapInt16(x)))
380 #elif defined(_MSC_VER)
382 # define BSWAP32(x) (_byteswap_ulong(x))
383 # define BSWAP16(x) (_byteswap_ushort(x))
392 #if !defined(__ICC) && defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && __GNUC_MINOR__ >= 3))
394 return static_cast<uint32
>(__builtin_bswap32(
static_cast<int32
>(x)));
396 return ((x >> 24) & 0xFF) | ((x >> 8) & 0xFF00) | ((x << 8) & 0xFF0000) | ((x << 24) & 0xFF000000);
407 return (x >> 8) | (x << 8);
static bool HasAtMostOneBit(T value)
Test whether value has at most 1 bit set.
static uint GB(const T x, const uint8 s, const uint8 n)
Fetch n bits from x, started at bit s.
static T KillFirstBit(T value)
Clear the first bit in an integer.
static bool HasBit(const T x, const uint8 y)
Checks if a bit in a value is set.
static T ClrBit(T &x, const uint8 y)
Clears a bit in a variable.
static T AB(T &x, const uint8 s, const uint8 n, const U i)
Add i to n bits of x starting at bit s.
static uint CountBits(T value)
Counts the number of set bits in a variable.
static uint16 BSWAP16(uint16 x)
Perform a 16 bits endianness bitswap on x.
Iterable ensemble of each set bit in a value.
static bool HasExactlyOneBit(T value)
Test whether value has exactly 1 bit set.
static T SB(T &x, const uint8 s, const uint8 n, const U d)
Set n bits in x starting at bit s to d.
static uint8 FindFirstBit2x64(const int value)
Finds the position of the first non-zero bit in an integer.
uint8 FindFirstBit(uint32 x)
Search the first set bit in a 32 bit variable.
static T ROL(const T x, const uint8 n)
ROtate x Left by n.
static uint32 BSWAP32(uint32 x)
Perform a 32 bits endianness bitswap on x.
uint8 FindLastBit(uint64 x)
Search the last set bit in a 64 bit variable.
const uint8 _ffb_64[64]
Lookup table to check which bit is set in a 6 bit variable.
static T ToggleBit(T &x, const uint8 y)
Toggles a bit in a variable.
static T SetBit(T &x, const uint8 y)
Set a bit in a variable.
static T ROR(const T x, const uint8 n)
ROtate x Right by n.
#define FIND_FIRST_BIT(x)
Returns the first non-zero bit in a 6-bit value (from right).