位域

# “位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。
# 位域在本质上就是一种结构类型, 不过其成员是按二进位分配

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;}

 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐