1 #ifndef OSL_MISC_MASK_H 2 #define OSL_MISC_MASK_H 14 template <
class Integer>
struct Bsf;
17 struct Bsf<unsigned int>
19 static int bsf(
unsigned int mask)
24 __asm__(
"bsfl %1,%0" :
"=r"(ret) :
"r"(mask));
29 __asm__(
"bsfl %1,%0" :
"=r"(ret) :
"r"(mask));
31 # elif defined __GNUC__ 32 return __builtin_ctzl(mask);
34 for (
int i=0;i<32;i++)
44 struct Bsf<unsigned short>
46 static unsigned short bsf(
unsigned short mask)
51 __asm__(
"bsfw %1,%0" :
"=r"(ret) :
"r"(mask));
56 __asm__(
"bsfw %1,%0" :
"=r"(ret) :
"r"(mask));
59 return __builtin_ctzl(mask);
66 struct Bsf<unsigned long long>
68 static int bsf(
unsigned long long mask)
73 __asm__(
"bsfq %1,%0" :
"=r"(ret) :
"r"(mask));
74 return static_cast<int>(ret);
76 unsigned int mask32 =
static_cast<unsigned int>(mask);
79 mask32 =
static_cast<unsigned int>(mask >> 32);
85 template <
class Integer>
struct Bsr;
88 struct Bsr<unsigned int>
90 static int bsr(
unsigned int mask)
95 __asm__(
"bsrl %1,%0" :
"=r"(ret) :
"r"(mask));
100 __asm__(
"bsrl %1,%0" :
"=r"(ret) :
"r"(mask));
103 return __builtin_clzl(mask);
105 for (
int i=31; i>=0; --i)
116 struct Bsr<unsigned long long>
118 static int bsr(
unsigned long long mask)
123 __asm__(
"bsrq %1,%0" :
"=r"(ret) :
"r"(mask));
124 return static_cast<int>(ret);
126 unsigned int mask32 =
static_cast<unsigned int>(mask >> 32);
129 mask32 =
static_cast<unsigned int>(mask);
137 template <
class Integer>
138 static int bsf(Integer mask)
142 template <
class Integer>
143 static int bsr(Integer mask)
147 template <
class Integer>
150 const int num=bsf(mask);
155 template <
class Integer>
170 template <
class Integer>
173 return (mask & (mask-1));
178 template <
class Integer>
181 return static_cast<Integer
>(mask & (-mask));
199 inline int countBitDense(
unsigned int mask)
201 mask = ((mask>>1)&0x55555555)+(mask&0x55555555);
202 mask = ((mask>>2)&0x33333333)+(mask&0x33333333);
203 mask = ((mask>>4)+mask)&0xf0f0f0f;
204 mask = (mask>>8)+mask;
205 return ((mask>>16)+mask)&0x3f;
211 template <
class Integer>
280 return (mask & (mask-1)) ? 2 : 1;
297 bool none()
const {
return mask == 0; }
298 bool any()
const {
return ! none(); }
299 Integer
value()
const {
return mask; }
302 template <
class Integer>
inline 307 template <
class Integer>
inline 312 template <
class Integer>
inline 315 return l.
value() < r.value();
318 template <
class Integer>
inline 324 template <
class Integer>
inline 330 template <
class Integer>
inline 336 template <
class Integer>
inline 339 return result <<= shift;
341 template <
class Integer>
inline 344 return result >>= shift;
353 std::ostream&
operator<<(std::ostream&,
const mask_t&);
int countBit2() const
non-zeroのmaskにセットされているビットの数を2まで数える.
GeneralMask & operator|=(const GeneralMask &r)
const GeneralMask operator~() const
GeneralMask< mask_int_t > mask_t
static bool hasMultipleBit(Integer mask)
const PtypeO PTYPEO_EDGE __attribute__((unused))
static int countBit(Integer mask)
GeneralMask & operator+=(const GeneralMask &r)
const GeneralMask< Integer > operator<<(GeneralMask< Integer > m, int shift)
int countBit() const
mask にセットされているビットの数を数える. あまり速くない.
const GeneralMask< Integer > operator|(GeneralMask< Integer > l, GeneralMask< Integer > r)
GeneralMask< unsigned long long > Mask64
const GeneralMask< Integer > operator^(GeneralMask< Integer > l, GeneralMask< Integer > r)
GeneralMask & operator-=(const GeneralMask &r)
GeneralMask & operator^=(const GeneralMask &r)
static int bsr(Integer mask)
bool hasMultipleBit() const
non-zeroのmaskが複数ビットセットされているかどうかを返す.
const GeneralMask< Integer > operator &(GeneralMask< Integer > l, GeneralMask< Integer > r)
GeneralMask(Integer value)
bool operator!=(const GeneralMask< Integer > &l, const GeneralMask< Integer > &r)
int takeOneBit()
non-zeroのmaskのsetされているビットをLSBから探し,その番号を返す 副作用としてmaskの対応するビットをク...
static Integer lowestBit(Integer mask)
non-zeroのmaskのsetされているビットをLSBから探し,そのビットだけがsetされたmaskを返す.
const GeneralMask< Integer > operator>>(GeneralMask< Integer > m, int shift)
static int bsf(unsigned long long mask)
unsigned long long mask_int_t
static int bsr(unsigned long long mask)
static int bsr(unsigned int mask)
static int takeOneBit(Integer &mask)
GeneralMask lowestBit() const
non-zeroのmaskのsetされているビットをLSBから探し,そのビットだけがsetされたmaskを返す.
static unsigned short bsf(unsigned short mask)
GeneralMask & operator>>=(int shift)
static const GeneralMask makeDirect(Integer value)
bool operator==(const GeneralMask< Integer > &l, const GeneralMask< Integer > &r)
static int bsf(unsigned int mask)
GeneralMask & operator<<=(int shift)
static int bsf(Integer mask)