[位域 - cppreference.com](https://zh.cppreference.com/w/cpp/language/bit_field)
`bool`使用一个字节的大小也就是8位, 但实际上它只需要表示`0`或者`1`,逻辑上来说只需要1位,在不能容忍浪费的场合浪费七分之一简直是犯罪
位域就可以让我们强制使用指定数量的二进制位
```cpp
struct Bool{
bool value : 1;
};
```
这样我们就有了一个只占用一个字节的`bool`变量
如果我们另外有一个占7位的字段,那就共同占了一个字节
```cpp
struct Bool{
bool value : 1;
unsigned int field : 7;
};
```
可以很自然地去使用,但是位域无法取地址,就很难知道内存中是怎么存储地,可以用取巧的方法达成目的
```cpp
#include <iostream>
#include <bitset>
union Bool
{
struct
{
bool value: 1;
unsigned char field: 7;
};
unsigned char data;
};
int main()
{
Bool b{};
b.value = true;
b.field = 0b1000001;
std::cout << std::bitset<8>(b.data) << std::endl;
b.value = false;
b.field = 0b0100010;
std::cout << std::bitset<8>(b.data) << std::endl;
return 0;
}
```
```text
10000011
01000100
```
番外:有个群友提出一个貌似无厘头的问题,那就是一位的有符号数是多少,也就是
```cpp
struct{
signed int value : 1;
}bitfield;
```
有符号数第一位是符号位,那就没有代表值的位了,根据数据类型的知识$n$位有符号数的取值范围是
$
-2^{n-1} \sim 2^{n-1}-1
$
那么一位的时候呢当$n = 1$时
$
-2^{1-1} \sim 2^{1-1}-1 = -1 \sim 0
$
根据补码原则,显然当$value = 1$时$value = -1$