#include #include #include using namespace std; struct sauer_uint_t { private: void putuint(unsigned char* &p, int n) { if (n < 0 || n >= (1<<21)) { *p++ = 0x80 | (n & 0x7F); *p++ = 0x80 | ((n>>7) & 0x7F); *p++ = 0x80 | ((n>>14) & 0x7F); *p++ = ((n>>21) & 0xFF); } else if (n < (1<<7)) { *p++ = n; } else if (n < (1<<14)) { *p++ = 0x80 | (n & 0x7F); *p++ = n >> 7; } else { *p++ = 0x80 | (n & 0x7F); *p++ = 0x80 | ((n>>7) & 0x7F); *p++ = (n>>14); } } int getuint(unsigned char*&p) { int n = *p++; if (!(n & (1 << 7))) return n; n -= (1 << 7); n = n | (*p++ << 7); if (!(n & (1 << 14))) return n; n -= (1 << 14); n = n | (*p++ << 14); if (!(n & (1 << 21))) return n; n -= (1 << 21); n = n | (*p++ << 21); if (n & (1 << 28)) n |= 0xF0000000; return n; } unsigned char m_data[4]; int m_size; public: sauer_uint_t() { memset(&m_data, '\0', 4); m_size = 1; } sauer_uint_t(sauer_uint_t& other) { memcpy(&m_data, &other.m_data, other.m_size); m_size = other.m_size; } sauer_uint_t(unsigned char* data, int size) { memmove(&m_data, data, size); m_size = size; } sauer_uint_t(int value) { if ( (((value >> 28) & 0xF) != 0x0) && (((value >> 28) & 0xF) != 0xF) ) { throw 0; } unsigned char* p = (unsigned char*)&m_data; putuint(p, value); m_size = p - ((unsigned char*)&m_data); } int to_uint() { unsigned char* p = (unsigned char*)&m_data; return getuint(p); } void to_cout() { cout << "sauer_uint_t(" << to_uint() << ") "; for(int i = 0; i < m_size; i++) { cout << (int)m_data[i] << " "; } cout << "\n"; } }; void print_put(int value) { cout << value << "\n"; sauer_uint_t(value).to_cout(); } void unit_test() { for(int i = -1 * 0x0FFFFFFF; i < 0x0FFFFFF; i++) { if(sauer_uint_t(i).to_uint() != i) { cout << "OUPS " << i << "\n"; } } } int main(int argc, char *argv[]) { //unit_test(); print_put(5); print_put(100); print_put(255); print_put(1000); print_put(-1); print_put(-666); print_put(-1234); print_put(-9999); system("PAUSE"); return EXIT_SUCCESS; }