@related: C byte java algo bit.fr bit.en limit
#define IS_BIG_ENDIAN (*(uint16_t *)"\0\xff" < 0x100)
/// emulate's java's unsigned shift : '>>>' #define MACRO_BITSHIFT_TYPE(type, value, offset) \ (((offset) > 0) ? \ ((((value) >> 1) \ & (~(((type)1) << ((sizeof(value) << 3) - 1)))) >> ((offset) - 1)) \ : ((offset) == 0 ) ? (value) : ((value)<<(offset)) \ ) #define BITSHIFT(value, offset) \ MACRO_BITSHIFT_TYPE(typeof(value), value, offset)
#define ISPOW2(x) (x && !(x & (x-1)))
/// O(1) #define ISPOW2(x) (((-x)&(x))==(x))
template <typename T> inline bool ISPOW2(const T &a) { return (a) > 0 && ((a) & ((a)-1)) == 0; }
/// O(32) #include <stdio.h> int isPower2(unsigned int n) { if ( ! n ) return n; /* n=0 in register */ for(;;(n>>=1)) { if ( n & 0x1 ) { return ( ! (n>>=1) ); } } } int main (int argc, char** argv) { int r; unsigned int i=0; if ( argc >1 ) i = atoi(argv[1]); r = isPower2( i ); printf("# %d is %sa power of 2\n", i , ( r ) ? "" : "not " ); return r; }
Endian: 4 char to uint32 :
u32<<=8; u32|=( buff[i+3] &0xFF); u32<<=8; u32|=( buff[i+2] &0xFF); u32<<=8; u32|=( buff[i+1] &0xFF); u32<<=8; u32|=( buff[i+0] &0xFF);