This section of the archives stores flipcode's complete Developer Toolbox collection, featuring a variety of mini-articles and source code contributions from our readers.

| Using Bit Fields Submitted by

A way to save memory is to use flag, here i little tips to make cleaner code
To store flag data like this way is to AVOID

    // Structure that content most important cpu informations
    // (avoid)
    typedef struct CPUINFO2
    {
     char* pszProcessor; // CPU Processor string
     char* pszVendor;    // CPU vendor name string

     bool bHasCPUID;     // Supports CPUID instruction
     bool bHasFPU;       // FPU present
     bool bHasVME;       // Virtual Mode Extensions
     bool bHasDebug;     // Debug extensions
     bool bHasPSE;       // Page Size Extensions
     bool bHasTSC;       // Time Stamp Counter
     bool bHasMSR;       // Model Specific Registers
     bool bHasPAE;       // Page Address Extensions
     bool bHasMCE;       // Machine Check Extensions
     bool bHasCMPXCHG8;  // CMPXCHG8 instruction
     bool bHasAPIC;      // APIC
     bool bHasSysCenter; // SYSENTER/SYSEXIT instruction
     bool bHasMTRR;      // Memory Type Range Registers
     bool bHasGPE;       // Global Paging Extensions
     bool bHasMCA;       // Machine Check Architecture
     bool bHasCMOV;      // CMOV instruction
     bool bHasPAT;       // Page Attribue Table
     bool bHasPSE36;     // PSE36 (Page Size Extensions)
     bool bHasMMXExt;    // MMX Extensions
     bool bHasMMX;       // MMX support
     bool bHasFXSave;    // FXSAVE/FXRSTOR instruction
     bool bHas3DNowExt;  // Extended 3DNow! support
     bool bHas3DNow;     // 3DNow! support
     bool bHasSSEMMX;    // SSE MMX support (same as MMXEXT)
     bool bHasSSE;       // SSE
     bool bHasSSEFP;     // SSE FP support
    } CPUINFO2, *LPCPUINFO2;

Why? using a byte for each flag make the struct consume memory as well
The solution is to use flag stored on a single data like byte , word or dword but the old way like that is not the prefered one:
remove flag:
dwFlags &= ~MYFLAG
Set flag:
dwFlags |= MYFLAG
Is flag:
if( dwFlags & MYFLAG )
By using bit field we can make cleaner code and using same memory as old flag way....
example:

    // Structure that content most important cpu informations
    // (prefered)
    typedef struct CPUINFO
    {
     char* pszProcessor;    // CPU Processor string
     char* pszVendor;       // CPU vendor name string

     struct
     {
      DWORD bHasCPUID     : 1; // Supports CPUID instruction
      DWORD bHasFPU       : 1; // FPU present
      DWORD bHasVME       : 1; // Virtual Mode Extensions
      DWORD bHasDebug     : 1; // Debug extensions
      DWORD bHasPSE       : 1; // Page Size Extensions
      DWORD bHasTSC       : 1; // Time Stamp Counter
      DWORD bHasMSR       : 1; // Model Specific Registers
      DWORD bHasPAE       : 1; // Page Address Extensions
      DWORD bHasMCE       : 1; // Machine Check Extensions
      DWORD bHasCMPXCHG8  : 1; // CMPXCHG8 instruction
      DWORD bHasAPIC      : 1; // APIC
      DWORD bHasSysCenter : 1; // SYSENTER/SYSEXIT instruction
      DWORD bHasMTRR      : 1; // Memory Type Range Registers
      DWORD bHasGPE       : 1; // Global Paging Extensions
      DWORD bHasMCA       : 1; // Machine Check Architecture
      DWORD bHasCMOV      : 1; // CMOV instruction
      DWORD bHasPAT       : 1; // Page Attribue Table
      DWORD bHasPSE36     : 1; // PSE36 (Page Size Extensions)
      DWORD bHasMMXExt    : 1; // MMX Extensions
      DWORD bHasMMX       : 1; // MMX support
      DWORD bHasFXSave    : 1; // FXSAVE/FXRSTOR instruction
      DWORD bHas3DNowExt  : 1; // Extended 3DNow! support
      DWORD bHas3DNow     : 1; // 3DNow! support
      DWORD bHasSSEMMX    : 1; // SSE MMX support (same as MMXEXT)
      DWORD bHasSSE       : 1; // SSE
      DWORD bHasSSEFP     : 1; // SSE FP support
     };
    } CPUINFO, *LPCPUINFO;

All states using bHas... is a single bit, not a byte or doubleword only bit
Note you can change for any bit as you want but the maximum of the struct must be 32 (dword) as well..
// Size of the struct CPUINFO is 12
// Size of the struct CPUINFO2 is 36
Hope you like it!

The zip file viewer built into the Developer Toolbox made use of the zlib library, as well as the zlibdll source additions.

Copyright 1999-2008 (C) FLIPCODE.COM and/or the original content author(s). All rights reserved.
Please read our Terms, Conditions, and Privacy information.