计算之比特位宽#
参考:计算之比特位宽
数据比特位宽是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
位宽与数值范围的关系#
数据类型的位宽决定了其能表示的数值范围。例如:
无符号整数(
unsigned
): 位可表示 到 。有符号整数:
位可表示 到 (补码表示)。
示例:
unsigned char
(8位):范围0
到255
( )。int
(32位):范围 到 |。
位运算操作#
位运算直接操作数据的二进制位,常用运算符:
&
(按位与)、|
(按位或)、^
(按位异或)、~
(取反)。<<
(左移)、>>
(右移)。
示例:提取比特位
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; // 检查标志