00001
00002
00003 #ifndef _SLOWBSF_H
00004 #define _SLOWBSF_H
00005
00006 namespace osl
00007 {
00008 namespace misc
00009 {
00014 inline int slowbsf(unsigned int mask){
00015 assert(mask);
00016 int mask0= (static_cast<int>(-(mask&0xffff)))>>31;
00017 mask&=(mask0^0xffff0000);
00018 int mask1= (static_cast<int>(-(mask&0xff00ff)))>>31;
00019 mask&=(mask1^0xff00ff00);
00020 int mask2= (static_cast<int>(-(mask&0xf0f0f0f)))>>31;
00021 mask&=(mask2^0xf0f0f0f0);
00022 int mask3= (static_cast<int>(-(mask&0x33333333)))>>31;
00023 mask&=(mask3^0xcccccccc);
00024 int mask4= (static_cast<int>(-(mask&0x55555555)))>>31;
00025 return 31+(mask0&0xfffffff0)+(mask1&0xfffffff8)+
00026 (mask2&0xfffffffc)+(mask3&0xfffffffe)+mask4;
00027 }
00028 }
00029 }
00030
00031 #endif
00032
00033
00034
00035