1 /* 2 * Copyright 2009, Haiku, Inc. All Rights Reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Brecht Machiels, brecht@mos6581.org 7 */ 8 9 #ifndef _BINARY_UTILS_H 10 #define _BINARY_UTILS_H 11 12 13 /* macro for a one-bit bitmask 14 */ 15 16 #define BIT(n) (1ULL << n) 17 18 /* macro/templates to create bitmasks 19 */ 20 21 #define BITMASK(high, low) ((unsigned long long)(BitMask<high, low>::value)) 22 23 template<int h, int l> 24 struct BitMask 25 { 26 enum { value = (BitMask<h-l-1,0>::value + 27 (1ULL << h - l)) << l }; 28 }; 29 30 31 template<> 32 struct BitMask<-1,0> 33 { 34 enum { value = 0ULL }; 35 }; 36 37 38 /* macro/templates to enter binary constants 39 */ 40 41 #define BINARY(binstring) ((unsigned long long)(Binary<0##binstring>::value)) 42 43 // http://www.eptacom.net/pubblicazioni/pub_eng/binary.html 44 template<const unsigned long long N> struct Binary 45 { 46 enum { value = (N % 8ULL) + 2ULL * Binary<N / 8ULL>::value }; 47 }; 48 49 50 template<> 51 struct Binary<0> 52 { 53 enum { value = 0ULL } ; 54 }; 55 56 57 /* macro/templates to determine offset 58 59 NOTE: broken for high bit indices 60 */ 61 62 #define MASKOFFSET(mask) (MaskOffset<mask, (mask & 1UL)>::count) 63 64 template<const unsigned long mask, unsigned int firstBit> 65 struct MaskOffset 66 { 67 enum { count = MaskOffset<(mask >> 1), ((mask >> 1) & 1UL)>::count + 1 }; 68 }; 69 70 71 template<const unsigned long mask> 72 struct MaskOffset<mask, 1> 73 { 74 enum { count = 0 }; 75 }; 76 77 #endif // _BINARY_UTILS_H 78 79