Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. Smaller than a byte

Smaller than a byte

Scheduled Pinned Locked Moved C / C++ / MFC
questiondata-structureshelp
14 Posts 9 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • W Offline
    W Offline
    Waldermort
    wrote on last edited by
    #1

    I have aa array of struct in my app, each struct is the size of a byte. My problem is that this array is very large, up to 256mb if the machine can cope with it. I know each struct is small, but I can half that size. I need 1 bit for a flag and 3 bits for a state. How can I declare the stuct to effectivly have two struct members each of which is 4 bits in size?

    struct block
    {
    BYTE Flag : 1;
    BYTE State : 3;
    };

    This is what I currently have, but it's size is still 1 byte even though only 4 bits are being used.

    Waldermort

    D L C S 4 Replies Last reply
    0
    • W Waldermort

      I have aa array of struct in my app, each struct is the size of a byte. My problem is that this array is very large, up to 256mb if the machine can cope with it. I know each struct is small, but I can half that size. I need 1 bit for a flag and 3 bits for a state. How can I declare the stuct to effectivly have two struct members each of which is 4 bits in size?

      struct block
      {
      BYTE Flag : 1;
      BYTE State : 3;
      };

      This is what I currently have, but it's size is still 1 byte even though only 4 bits are being used.

      Waldermort

      D Offline
      D Offline
      David Crow
      wrote on last edited by
      #2

      How are you packing the structure?


      "A good athlete is the result of a good and worthy opponent." - David Crow

      "To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne

      W 1 Reply Last reply
      0
      • D David Crow

        How are you packing the structure?


        "A good athlete is the result of a good and worthy opponent." - David Crow

        "To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne

        W Offline
        W Offline
        Waldermort
        wrote on last edited by
        #3

        standard #pragma pack ( push, 1 )

        Waldermort

        W 1 Reply Last reply
        0
        • W Waldermort

          standard #pragma pack ( push, 1 )

          Waldermort

          W Offline
          W Offline
          Waldermort
          wrote on last edited by
          #4

          This seems to work, but accessing the members is a pain

          struct block
          {
          union
          {
          struct Upper
          {
          BYTE State : 1;
          BYTE Repaint : 3;
          };
          struct Lower
          {
          BYTE State : 1;
          BYTE Repaint : 3;
          };
          } U;
          }

          Waldermort

          M 1 Reply Last reply
          0
          • W Waldermort

            I have aa array of struct in my app, each struct is the size of a byte. My problem is that this array is very large, up to 256mb if the machine can cope with it. I know each struct is small, but I can half that size. I need 1 bit for a flag and 3 bits for a state. How can I declare the stuct to effectivly have two struct members each of which is 4 bits in size?

            struct block
            {
            BYTE Flag : 1;
            BYTE State : 3;
            };

            This is what I currently have, but it's size is still 1 byte even though only 4 bits are being used.

            Waldermort

            L Offline
            L Offline
            led mike
            wrote on last edited by
            #5

            WalderMort wrote:

            This is what I currently have, but it's size is still 1 byte even though only 4 bits are being used.

            I believe the minimum size of your structure is the size of the base type, in this case BYTE.

            1 Reply Last reply
            0
            • W Waldermort

              This seems to work, but accessing the members is a pain

              struct block
              {
              union
              {
              struct Upper
              {
              BYTE State : 1;
              BYTE Repaint : 3;
              };
              struct Lower
              {
              BYTE State : 1;
              BYTE Repaint : 3;
              };
              } U;
              }

              Waldermort

              M Offline
              M Offline
              Mark Salsbery
              wrote on last edited by
              #6

              Doesn't Upper and Lower use the same bits? Mark

              Mark Salsbery Microsoft MVP - Visual C++ :java:

              W 1 Reply Last reply
              0
              • M Mark Salsbery

                Doesn't Upper and Lower use the same bits? Mark

                Mark Salsbery Microsoft MVP - Visual C++ :java:

                W Offline
                W Offline
                Waldermort
                wrote on last edited by
                #7

                Yeah, I just realised, I'm still trying to get it...

                Waldermort

                M 1 Reply Last reply
                0
                • W Waldermort

                  Yeah, I just realised, I'm still trying to get it...

                  Waldermort

                  M Offline
                  M Offline
                  Mark Salsbery
                  wrote on last edited by
                  #8

                  AFAIK, byte granularity is all you're going to get unless you pack two pairs in each struct:

                  struct block
                  {
                  BYTE State : 1;
                  BYTE Repaint : 3;
                  BYTE State2 : 1;
                  BYTE Repaint2 : 3;
                  };

                  Do you have to have a struct type?  Can you wrap the array in a class and provide accessors to packed State/Repaint bits instead?

                  Mark Salsbery Microsoft MVP - Visual C++ :java:

                  T 1 Reply Last reply
                  0
                  • W Waldermort

                    I have aa array of struct in my app, each struct is the size of a byte. My problem is that this array is very large, up to 256mb if the machine can cope with it. I know each struct is small, but I can half that size. I need 1 bit for a flag and 3 bits for a state. How can I declare the stuct to effectivly have two struct members each of which is 4 bits in size?

                    struct block
                    {
                    BYTE Flag : 1;
                    BYTE State : 3;
                    };

                    This is what I currently have, but it's size is still 1 byte even though only 4 bits are being used.

                    Waldermort

                    C Offline
                    C Offline
                    Chris Losinger
                    wrote on last edited by
                    #9

                    have you looked at bitfields ?

                    image processing toolkits | batch image processing

                    W 1 Reply Last reply
                    0
                    • C Chris Losinger

                      have you looked at bitfields ?

                      image processing toolkits | batch image processing

                      W Offline
                      W Offline
                      Waldermort
                      wrote on last edited by
                      #10

                      Funny you say that, I was just playing around with the bitfields and found my solution. Though I'm not sure of how portable it may be.

                      struct block
                      {
                      union
                      {
                      struct Upper
                      {
                      BYTE Pack : 4;
                      BYTE State : 3;
                      BYTE Repaint : 1;
                      };
                      struct Lower
                      {
                      BYTE State : 3;
                      BYTE Repaint : 1;
                      };

                          BYTE Total;
                      } U;
                      

                      };

                      Waldermort

                      1 Reply Last reply
                      0
                      • W Waldermort

                        I have aa array of struct in my app, each struct is the size of a byte. My problem is that this array is very large, up to 256mb if the machine can cope with it. I know each struct is small, but I can half that size. I need 1 bit for a flag and 3 bits for a state. How can I declare the stuct to effectivly have two struct members each of which is 4 bits in size?

                        struct block
                        {
                        BYTE Flag : 1;
                        BYTE State : 3;
                        };

                        This is what I currently have, but it's size is still 1 byte even though only 4 bits are being used.

                        Waldermort

                        S Offline
                        S Offline
                        Sameerkumar Namdeo
                        wrote on last edited by
                        #11

                        Original struct struct aablock { BYTE Flag : 1; BYTE State : 3; }; Original array of size 512 MAXSIZE = 512 aablock aa[MAXSIZE]; Modified Struct struct bbblock { BYTE FlagOdd : 1; BYTE StateOdd : 3; BYTE FlagEven : 1; BYTE StateEven : 3; }; try to suffle the elements if size of this struct > sizeof(BYTE) if you are having an array of size say 512 then you may declare array with half of that size. Each element will store 2 elements of original struct bbblock bb[MAXSIZE/2]; j = -1; for(i = 0; i < MAXSIZE/2; ++i) { j++ // j = 0, 2, 4, 6... bb[i].FlagEven = aa[j].Flag; bb[i].StateEven = aa[j].State; j++; // j = 1, 3, 5..... bb[i].FlagOdd = aa[j].Flag; bb[i].StateOdd = aa[j].State; }

                        Z 1 Reply Last reply
                        0
                        • M Mark Salsbery

                          AFAIK, byte granularity is all you're going to get unless you pack two pairs in each struct:

                          struct block
                          {
                          BYTE State : 1;
                          BYTE Repaint : 3;
                          BYTE State2 : 1;
                          BYTE Repaint2 : 3;
                          };

                          Do you have to have a struct type?  Can you wrap the array in a class and provide accessors to packed State/Repaint bits instead?

                          Mark Salsbery Microsoft MVP - Visual C++ :java:

                          T Offline
                          T Offline
                          thestrat
                          wrote on last edited by
                          #12

                          I think struct is creatin a problem. try doing it by using union inside a struct. i think it will work. tHeStRat

                          1 Reply Last reply
                          0
                          • S Sameerkumar Namdeo

                            Original struct struct aablock { BYTE Flag : 1; BYTE State : 3; }; Original array of size 512 MAXSIZE = 512 aablock aa[MAXSIZE]; Modified Struct struct bbblock { BYTE FlagOdd : 1; BYTE StateOdd : 3; BYTE FlagEven : 1; BYTE StateEven : 3; }; try to suffle the elements if size of this struct > sizeof(BYTE) if you are having an array of size say 512 then you may declare array with half of that size. Each element will store 2 elements of original struct bbblock bb[MAXSIZE/2]; j = -1; for(i = 0; i < MAXSIZE/2; ++i) { j++ // j = 0, 2, 4, 6... bb[i].FlagEven = aa[j].Flag; bb[i].StateEven = aa[j].State; j++; // j = 1, 3, 5..... bb[i].FlagOdd = aa[j].Flag; bb[i].StateOdd = aa[j].State; }

                            Z Offline
                            Z Offline
                            zakkas2483
                            wrote on last edited by
                            #13

                            Good Ans.... But i have some confusion. In That code what is the meaning of This BYTE Flag : 1; Line. How we can use one bit from that Byte? i got the error on that each line.. Please solve my doubt. :) hiren Thakkar

                            I 1 Reply Last reply
                            0
                            • Z zakkas2483

                              Good Ans.... But i have some confusion. In That code what is the meaning of This BYTE Flag : 1; Line. How we can use one bit from that Byte? i got the error on that each line.. Please solve my doubt. :) hiren Thakkar

                              I Offline
                              I Offline
                              Iain Clarke Warrior Programmer
                              wrote on last edited by
                              #14

                              If you read the other answers, you'll see someone refers to bitfields. That's the important clue - you can look that up in your c++ book, as the full answer is too long for me to bother typing here! Iain.

                              1 Reply Last reply
                              0
                              Reply
                              • Reply as topic
                              Log in to reply
                              • Oldest to Newest
                              • Newest to Oldest
                              • Most Votes


                              • Login

                              • Don't have an account? Register

                              • Login or register to search.
                              • First post
                                Last post
                              0
                              • Categories
                              • Recent
                              • Tags
                              • Popular
                              • World
                              • Users
                              • Groups