The draft C++ standard says sizeof shall not be applied to a bit-field in section 5.3.3
Sizeof paragraph 1. If you have control of the source then using an enum sounds much simpler and neater:
struct mybits
{
enum bitFieldSizes
{
field1 = 15,
field2 = 2,
field3 = 4,
field4 = 8,
field5 = 31
};
unsigned int one : field1 ;
unsigned int two : field2 ;
unsigned int three : field3 ;
unsigned int four : field4 ;
unsigned int five : field5 ;
};
If you don't have control of the source it is possible to use bit hacks to obtain the size of your bit-field and std::bitset makes it easier:
#include <iostream>
#include <bitset>
struct mybits
{
unsigned int one : 15 ;
unsigned int two : 2 ;
unsigned int three : 4 ;
unsigned int four : 8 ;
unsigned int five : 31 ;
};
int main()
{
mybits mb1 ;
mb1.one = ~0 ;
mb1.two = ~0 ;
mb1.three = ~0 ;
mb1.four = ~0 ;
mb1.five = ~0 ;
std::bitset<sizeof(unsigned int)*8> b1(mb1.one);
std::bitset<sizeof(unsigned int)*8> b2(mb1.two);
std::bitset<sizeof(unsigned int)*8> b3(mb1.three);
std::bitset<sizeof(unsigned int)*8> b4(mb1.four);
std::bitset<sizeof(unsigned int)*8> b5(mb1.five);
std::cout << b1 << ":" << b1.count() << std::endl ;
std::cout << b2 << ":" << b2.count() << std::endl ;
std::cout << b3 << ":" << b3.count() << std::endl ;
std::cout << b4 << ":" << b4.count() << std::endl ;
std::cout << b5 << ":" << b5.count() << std::endl ;
}
which produces the following output:
00000000000000000111111111111111:15
00000000000000000000000000000011:2
00000000000000000000000000001111:4
00000000000000000000000011111111:8
01111111111111111111111111111111:31
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…