//| Copyright: (C) 2020-2024 Kevin Larke //| License: GNU GPL version 3.0 or above. See the accompanying LICENSE file. #include "cwCommon.h" #include "cwLog.h" #include "cwCommonImpl.h" #include "cwUtility.h" void cw::printHex( const void* buf, unsigned bufByteN, bool asciiFl ) { const unsigned char* data = static_cast(buf); const unsigned colN = 8; unsigned ci = 0; for(unsigned i=0; i all elements zero */ { exp = (short)(std::log(val)/std::log(2.0) + 16383.0); val *= pow(2.0, 31.0+16383.0-(double)exp); mant1 =((unsigned)val); val -= ((double)mant1); val *= pow(2.0, 32.0); mant0 =((double)val); } *p++ = ((sign<<7)|(exp>>8)); *p++ = (u_char)(0xFF & exp); *p++ = (u_char)(0xFF & (mant1>>24)); *p++ = (u_char)(0xFF & (mant1>>16)); *p++ = (u_char)(0xFF & (mant1>> 8)); *p++ = (u_char)(0xFF & (mant1)); *p++ = (u_char)(0xFF & (mant0>>24)); *p++ = (u_char)(0xFF & (mant0>>16)); *p++ = (u_char)(0xFF & (mant0>> 8)); *p++ = (u_char)(0xFF & (mant0)); } bool cw::isPowerOfTwo( unsigned x ) { return !( (x < 2) || (x & (x-1)) ); } unsigned cw::nextPowerOfTwo( unsigned val ) { unsigned i; unsigned mask = 1; unsigned msb = 0; unsigned cnt = 0; // if val is a power of two return it if( isPowerOfTwo(val) ) return val; // next pow of zero is 2 if( val == 0 ) return 2; // if the next power of two can't be represented in 32 bits if( val > 0x80000000) { assert(0); return 0; } // find most sig. bit that is set - the number with only the next msb set is next pow 2 for(i=0; i<31; i++,mask<<=1) if( mask & val ) { msb = i; cnt++; } return 1 << (msb + 1); } unsigned cw::nearestPowerOfTwo( unsigned i ) { unsigned vh = nextPowerOfTwo(i); if( vh == 2 ) return vh; unsigned vl = vh / 2; if( vh - i < i - vl ) return vh; return vl; } #endif