This shows you the differences between two versions of the page.
bit [2015/06/03 22:20] |
bit [2022/04/16 12:22] (current) |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | @related: [[C]] [[byte]] [[java]] [[algo]] [[bit.fr]] [[bit.en]] [[limit]] | ||
+ | |||
+ | * http://www-graphics.stanford.edu/~seander/bithacks.html | ||
+ | * http://publications.gbdirect.co.uk/c_book/chapter6/bitfields.html | ||
+ | |||
+ | |||
+ | ==== ENDIANS ==== | ||
+ | |||
+ | #define IS_BIG_ENDIAN (*(uint16_t *)"\0\xff" < 0x100) | ||
+ | |||
+ | * http://msdn.microsoft.com/en-us/library/ms819743.aspx | ||
+ | * http://stackoverflow.com/questions/2100331/c-macro-definition-to-determine-big-endian-or-little-endian-machine | ||
+ | |||
+ | |||
+ | ==== bit shifting ==== | ||
+ | |||
+ | <code> | ||
+ | /// 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) | ||
+ | </code> | ||
+ | |||
+ | |||
+ | ==== power of 2 ==== | ||
+ | |||
+ | * http://www.catch22.net/tuts/c-c-tricks | ||
+ | |||
+ | #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 : | ||
+ | |||
+ | <code> | ||
+ | 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); | ||
+ | </code> | ||
+ | |||
+ | |||
+ | ==== MorE ==== | ||
+ | |||
+ | {{http://i.huffpost.com/gadgets/slideshows/246711/slide_246711_1426175_free.jpg}} | ||
+ | |||