00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef _SB_BIT_UTIL_H_
00024 #define _SB_BIT_UTIL_H_
00025
00026 #include <Inventor/SbBasic.h>
00027
00028 #ifndef HIDDEN_FROM_DOC
00029
00043 class SbBitUtil
00044 {
00045 private:
00049 static int getNumBits(const unsigned long Mask);
00050
00056 static int getOffsetBit(const unsigned long Mask);
00057
00061 static unsigned long buildMask(const int bitOffset);
00062
00066 static int getHeavierBit(const unsigned long Mask);
00067
00068 };
00069
00070 inline int
00071 SbBitUtil::getNumBits(const unsigned long Mask)
00072 {
00073 int numBits = 0;
00074 for (unsigned long i = Mask; i != 0; numBits += (i & 1), i >>= 1) ;
00075
00076 return numBits;
00077 }
00078
00079 inline int
00080 SbBitUtil::getOffsetBit(const unsigned long Mask)
00081 {
00082 int indice;
00083 unsigned long mask = Mask;
00084 for (indice = -1; mask; indice++, mask >>=1) ;
00085
00086 return indice;
00087 }
00088
00089 inline unsigned long
00090 SbBitUtil::buildMask(const int bitOffset)
00091 {
00092 return (1 << bitOffset);
00093 }
00094
00095 inline int
00096 SbBitUtil::getHeavierBit (const unsigned long Mask)
00097 {
00098 unsigned long heavier = ((unsigned long)1) << ((sizeof(unsigned long) * 8) - 1);
00099 int i;
00100 for (i = (sizeof(unsigned long) * 8) - 1;
00101 (heavier) && !(heavier & Mask); heavier >>= 1, i--) ;
00102
00103 return i;
00104 }
00105
00106 #endif // HIDDEN_FROM_DOC
00107
00108 #endif //_SB_BIT_UTIL_H_
00109
00110
00111