7.c++struct结构体-位域 (tcy)
位域# “位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。# 位域在本质上就是一种结构类型, 不过其成员是按二进位分配1.位域定义:struct 位域结构名{ 类型符 位域名:位域长度;... };#与结构定义相仿struct bs {int a:8;int b:2;int c:6;};#先定义后说明struct bs{int a:8;...
·
位域
# “位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。
# 位域在本质上就是一种结构类型, 不过其成员是按二进位分配
1.位域定义:
struct 位域结构名 { 类型符 位域名:位域长度;... };#与结构定义相仿
struct bs {int a:8;int b:2;int c:6;}; #先定义后说明
struct bs{int a:8;int b:2;int c:6;}data;#同时定义说明; 说明data为bs变量
# 占2字节,位域a占8位位域b占2位位域c占6位
struct bs
{
unsigned a:4;
unsigned :0 ; /*空域*/
unsigned b:4; /*从下一单元开始存放*/
unsigned c:4;
}
struct k
{
int a:1
int :2 /*该2位不能使用*/
int b:3
int c:2
};
说明:
1). 一个位域必须存储在同一个字节中,不能跨字节
2).如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。
3).位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位
4).无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用
2.位域的使用
# 位域的使用和结构成员的使用相同
形式: 位域变量名·位域名
3.实例:
#include <iostream>
#include <bitset> //二进制处理
#include <iomanip>
using namespace std;
int main(){
struct bs
{//定义了位域结构bs,三个位域为a1, a2, a3
unsigned a1: 1;
unsigned : 0; //其余7位不用
unsigned a2: 3; //第2个字节的3位
unsigned : 2; //第2个字节空2位
unsigned a3: 4; //第2字节不够用,从第3字节开始4位
} bit, *pbit;
bit = { 1,0b111,0b1111}; //方法1:初始化数据
bit.a1=1;bit.a2=7;bit.a3=15; //方法2:初始化数据
bitset<8> b1(bit.a1); string s1=b1.to_string(); //转换为二进制字符串
bitset<8> b2(bit.a2); string s2=b2.to_string();
bitset<8> b3(bit.a3); string s3=b3.to_string();
printf("%s,%s,%s\n",s1.c_str(),s2.c_str(),s3.c_str());//00000001, 00000111, 00001111
pbit = &bit; //位域变量bit的地址送给指针变量pbit
pbit->a1 = 0; //用指针方式给位域a1重新赋值,赋为0
pbit->a2 &= 3; //复合的位运算符"&=",等价:pbit->a2=(pbit->a2 & 3)
pbit->a3 |= 1; //复合位运算"|=",等价: pbit->a3 = (pbit->a3 | 1)
printf("%d,%d,%d\n", pbit->a1, pbit->a2, pbit->a3);//0, 3, 15
return 0;}
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)