#include <iostream> using namespace std; class Student { private: // packing student info in 2 bytes: // // 13 8 7 6 2 10 // .. xxxxxx x xxxxx xx // // Year in bits 0..1: 2 bits for 4 options (00, 01, 10, 11) // Credits in bits 2..6: 5 bits for 32 options (0..31) // Major in bit 7: 1 bits for 2 options (T/F) // GPA in bits 8..13: 6 bits for 45 options (0..44) // // bits 14 and 15 are not used unsigned short data; public: Student() : data(0) { } Student( int year, int credits ) : data(0) { setYear( year ); setCredits( credits ); } void setYear( int year ) { unsigned short mask = 0x0003; // or 0b0000.0000.0000.0011 data = data & ~mask; // last 2 bits of data are 00, rest unchanged // note mask inverted before use year = year - 1; // convert 1,2,3,4, i.e. 01, 10, 11, 100 // into 0,1,2,3, i.e. 00, 01, 10, 11 data = data | year; // last 2 bits of data have year, rest unchanged } int getYear() { unsigned short mask = 0x0003; // or 0b0000.0000.0000.0011 unsigned short year = data & mask; // extract only last two bits, rest are 0 return year + 1; // convert 0,1,2,3 back to 1,2,3,4 } void setCredits( int credits ) { unsigned short mask = 0x001F; // or 0b0000.0000.0001.1111 (5 bits) mask = mask << 2; // move by 2 to position under bits 2..6 // 0b0000.0000.0111.1100 mask = ~mask; // flip 0b1111.1111.1000.0011 // so that desired 5 bits can be cleared data = data & mask; // bits 2..6 are 0, rest unchanged credits = credits << 2; // move by 2 to position under bits 2..6 data = data | credits; // bits 2..6 have credits, rest unchanged } int getCredits() { unsigned short mask = 0x001F; // or 0b0000.0000.0001.1111 (5 bits) mask = mask << 2; // move by 2 to position under bits 2..6 // 0b0000.0000.0111.1100 unsigned short credits = data & mask; // credits has bits 2..6, rest are 0 credits = credits >> 2; // move by 2 to position at beginning return credits; } void print() { cout << "Student details:" << endl << "- year : " << getYear() << endl << "- credits: " << getCredits() << endl; // << "- major : " << getMajor() << endl // << "- gpa : " << getGPA() << endl; } }; int main() { Student s1; // calls default c-tor Student s2( 1, 25 ); // calls 2nd c-tor s1.print(); s2.print(); s1.setYear(2); cout << s1.getYear() << endl; s1.setCredits(17); cout << s1.getCredits() << endl; s1.print(); s1.setYear(3); cout << s1.getYear() << endl; s1.setCredits(23); cout << s1.getCredits() << endl; s1.print(); }