Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // GNU++98
- #include <iostream>
- #include <stdint.h>
- #include <bitset>
- template <class T, unsigned _pos, unsigned _size>
- class ByAccess {
- public:
- typedef T data_type;
- void set(data_type v)
- {
- static const data_type mask = (1 << _size) - 1;
- data_type res = v & mask;
- res <<= _pos;
- data &= ~ (mask << _pos);
- data |= res;
- }
- data_type get()
- {
- static const unsigned move = sizeof(data_type)*8 - _size;
- data_type result = data << (move - _pos);
- result >>= move;
- result &= (1 << _size) - 1;
- return result;
- }
- operator data_type() { return get(); }
- // non-lvalue;
- ByAccess& operator= (const data_type& v) { set(v); return *this; }
- private:
- data_type data;
- };
- struct A {
- union {
- int16_t a;
- ByAccess<int16_t, 0, 3> a1;
- ByAccess<int16_t, 3, 2> a2;
- ByAccess<int16_t, 5, 3> a3;
- ByAccess<int16_t, 8, 4> a4;
- ByAccess<int16_t, 12, 4> a5;
- };
- };
- int main()
- {
- A pack;
- pack.a = 0xAC9B;
- std::cout << "a= " << std::bitset<16>(pack.a) << "\n";
- pack.a1 = 7;
- std::cout << "1) a= " << std::bitset<16>(pack.a) << "\n";
- pack.a2 = 3;
- std::cout << "2) a= " << std::bitset<16>(pack.a) << "\n";
- pack.a2 = pack.a3 = 5;
- std::cout << "3) a= " << std::bitset<16>(pack.a) << "\n";
- std::cout << "a1= " << std::bitset<16>(pack.a1) << "\n";
- std::cout << "a2= " << std::bitset<16>(pack.a2) << "\n";
- std::cout << "a3= " << std::bitset<16>(pack.a3) << "\n";
- std::cout << "a4= " << std::bitset<16>(pack.a4) << "\n";
- std::cout << "a5= " << std::bitset<16>(pack.a5) << "\n";
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement