计算之比特位宽#

参考:计算之比特位宽

数据比特位宽是C++中非常重要的概念,理解它对于内存优化、位运算以及底层编程都很关键。

比特与字节

  • 比特(bit):计算机最小存储单位,只有 0 或 1 两种状态。

  • 字节(Byte):由 8 个比特组成(1Byte = 8bit)。

  • 字长(Word):CPU 一次能处理的数据宽度(如 32位 / 64位系统)。

C++ 基本数据类型的位宽**#

不同数据类型占用的比特数不同,可通过 sizeof() 查看字节数(需乘以 8 转换为比特)。

#include <iostream>
using namespace std;

cout << "bool: " << sizeof(bool) * 8 << " bits" << endl;       // 通常 8 位
cout << "char: " << sizeof(char) * 8 << " bits" << endl;       // 8 位
cout << "int: " << sizeof(int) * 8 << " bits" << endl;         // 通常 32 位
cout << "float: " << sizeof(float) * 8 << " bits" << endl;     // 32 位
cout << "double: " << sizeof(double) * 8 << " bits" << endl;   // 64 位
bool: 8 bits
char: 8 bits
int: 32 bits
float: 32 bits
double: 64 bits
@0x7f2d49185ca0

位宽与数值范围的关系#

数据类型的位宽决定了其能表示的数值范围。例如:

  • 无符号整数(unsignedn 位可表示 02n1

  • 有符号整数n 位可表示 2n12n11(补码表示)。

示例

  • unsigned char(8位):范围 0255281)。

  • int(32位):范围 2,147,483,6482,147,483,647|。

位运算操作#

位运算直接操作数据的二进制位,常用运算符:

  • &(按位与)、|(按位或)、^(按位异或)、~(取反)。

  • <<(左移)、>>(右移)。

示例:提取比特位

unsigned int num = 21;  // 二进制: 0001 0101
bool bit2 = (num & (1 << 2)) != 0;  // 提取第2位(从0开始)
cout << "第2位是: " << (bit2 ? "1" : "0") << endl; 
第2位是: 1

位域(Bit Fields)#

用于在结构体中精确控制成员变量占用的比特数,节省内存。

struct Color {
    unsigned int red : 5;    // 5位,范围0-31
    unsigned int green : 6;  // 6位,范围0-63
    unsigned int blue : 5;   // 5位,范围0-31
};

Color c = {30, 60, 28};
cout << "红色值: " << c.red << endl;
红色值: 30

底层编程应用#

  • 内存对齐:编译器可能会插入填充字节以对齐数据,影响实际内存占用。

  • 位掩码(Bitmask):用于标志位的组合,例如:

enum Flags {
    READ = 1,    // 0001
    WRITE = 2,   // 0010
    EXECUTE = 4  // 0100
};

int permissions = READ | WRITE;  // 组合标志:0011
bool canWrite = (permissions & WRITE) != 0;  // 检查标志