dllbridge

Битовые поля

May 8th, 2026
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.21 KB | None | 0 0
  1.  
  2.  
  3.  
  4. #include  <iostream>
  5. #include   <iomanip>
  6. using namespace std;
  7.  
  8. ////////////////////////////////
  9. struct DeviceSettings                                                        // Пример 1: Настройки устройства (флаги)
  10. {
  11.     unsigned int    powerOn : 1;                                             // 1 бит  (0/ 1)
  12.     unsigned int       mode : 2;                                             // 2 бита (0- 3)
  13.     unsigned int     volume : 4;                                             // 4 бита (0-15)
  14.     unsigned int brightness : 3;                                             // 3 бита (0- 7)
  15.     unsigned int   reserved : 6;                                             // не используется
  16. };
  17.  
  18.  
  19.  
  20. /////////////////////////////////
  21. struct CompactDate                                                           // Пример 2: Дата в компактном виде
  22. {
  23.     unsigned int   day      : 5;                                             // 1- 31 (5 бит)
  24.     unsigned int month      : 4;                                             // 1- 12 (4 бита)
  25.     unsigned int  year      : 7;                                             // 0-127 (от 2000 года)
  26. };
  27.  
  28.  
  29.  
  30. ////////////////////////////////////////////////////
  31. int main()
  32. {
  33.    
  34.    
  35.     setlocale(LC_ALL, "rus");
  36.    
  37.     cout << "=== БИТОВЫЕ ПОЛЯ В C++ ===\n\n";
  38.    
  39.  
  40.     DeviceSettings settings;                                                 // Пример 1: Настройки устройства
  41.     settings.powerOn    =  1;                                                // включено
  42.     settings.mode       =  2;                                                // режим 2
  43.     settings.volume     = 10;                                                // громкость 10
  44.     settings.brightness =  5;                                                // яркость 5
  45.    
  46.     cout << "Пример 1: Настройки устройства\n";
  47.     cout << "Питание:   " << settings.powerOn    << "\n";
  48.     cout << "Режим:     " << settings.mode       << "\n";
  49.     cout << "Громкость: " << settings.volume     << "\n";
  50.     cout << "Яркость:   " << settings.brightness << "\n";
  51.     cout << "Размер структуры: " << sizeof(DeviceSettings)  << " байт\n\n";
  52.    
  53.    
  54.     CompactDate today;                                                        //            Пример 2: Компактная дата
  55.     today.day    = 15;
  56.     today.month  =  5;                                                        // май
  57.     today.year   = 24;                                                        // 2024 год
  58.    
  59.     cout << "Пример 2: Компактная дата\n";
  60.     cout << "Дата: " << today.day << "."  << today.month << ".20" << today.year << "\n";
  61.            
  62.     cout << "Размер структуры: " << sizeof(CompactDate)   << " байт\n\n";
  63.            
  64.    
  65.  
  66.     struct SmallCounter                                                       // Пример 3: Демонстрация переполнения
  67.     {
  68.         unsigned int value : 3;                                               // только 0-7
  69.     };
  70.    
  71.     SmallCounter counter;
  72.     counter.value = 5;
  73.     cout << "Пример 3: Счетчик (3 бита)\n";
  74.     cout << "Значение 5: " << counter.value << "\n";
  75.    
  76.     counter.value = 10;                                                    // переполнение! 10 не помещается в 3 бита
  77.     cout << "Переполнение 10 -> " << counter.value
  78.               << " (только младшие 3 бита)\n\n";
  79.    
  80.  
  81.     cout << "Пример 4: Побайтовый вывод\n";                                                // Прямой доступ к памяти
  82.     unsigned char* bytes = reinterpret_cast<unsigned char*>(&settings);
  83.     cout << "Байте структуры DeviceSettings: ";
  84.     for(size_t i = 0; i < sizeof(DeviceSettings); ++i)
  85.     {
  86.        
  87.        cout << hex << setw(2) << setfill('0')  << (int)bytes[i] << " ";
  88.                  
  89.     }
  90.     cout << dec << "\n";
  91.    
  92.     return 0;
  93. }
  94.  
  95.  
  96.  
  97.  
  98.  
Advertisement
Add Comment
Please, Sign In to add comment