美文网首页
C语言笔记(六)---位运算及位域

C语言笔记(六)---位运算及位域

作者: 坚持到底v2 | 来源:发表于2018-06-22 16:51 被阅读0次

第十二章 位运算

& 按位与
| 按位或
^ 按位异或
~ 按位取反
<< 左移:高位丢弃,低位补0
>> 右移:低位丢弃,高位补什么取决于编译系统的规定。

关于右移,对于有符号数,在右移时,符号位将随同移动。
当为正数时,最高位补0,而为负数时,符号位为1,最高位是补0或是补1取决于编译系统的规定。
TurboC和很多系统规定为补1.

例子:

main() {
  char a='a',b='b';
  int p,c,d;
  p=a;
  p=(p<<8)|b;
  d=p&0xff;
  c=(p&0xff00)>>8;
  printf("a=%d b=%d c=%d d=%d",a,b,c,d);
}

1. 位域(位段)

有些信息在存储时并不需要占用一个完整的字节,而只需占几个或一个二进制位。
所以C语言又提供了一种数据结构,称为 “位域”或“位段”。
所谓 “位域” 是把一个字节中的二进制位划分为几个不同的区域,并声明每个区域的位数。
每个域有一个域名,允许在程序中按域名进行操作。
这样就可以把几个不同的对象用一个字节的二进制位域来表示。

(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类型变量,共占两个字节,位域 a占8位,b占2位,c占6位。

对于位域的定义尚有以下几点说明:

  • a)一个位域必须存储在同一个字节中,不能跨两个字节。
    如一个字节所剩空间不够存储另一位域时,应从下一单元起存放该位域。
    也可以有意使某位域从下一单元开始。例如:
struct bs {
  unsigned a:4;
  unsigned :0; /*空域*/
  unsigned b:4; /*从下一单元开始存放*/
  unsigned c:4;
}

在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占4位,c占4位。

  • b)由于位域不允许跨两个字节,因为位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。

  • c)位域可以无位域名,这是他只用来做填充或调整位置。无名的位域是不能使用的。
    例如:

struct k {
  int a:1;
  int  :2;
  int b:3;
  int c:2;
}

从以上分析可以看出,位域在本质上就是一种结构类型,不过其成员是按二进位分配的。

(2)位域的使用

位域变量名.位域名

位域允许用各种格式输出。
例子:

main() {
 struct bs  {
  unsigned a:1;
  unsigned b:3;
  unsigned c:4;
 } bit,*pbit;

 bit.a=1;
 bit.b=7;
 bit.c=15;
 printf("%d,%d,%d\n",bit.a,bit.b,bit.c);

 pbit=&bit;
 pbit->a=0;
 pbit->b&=3;
 pbit->c|=1;
 printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c);

相关文章

  • C语言笔记(六)---位运算及位域

    第十二章 位运算 & 按位与| 按位或^ 按位异或~ 按位取反<< 左移:高位丢弃,低位补0>> 右移:低位丢弃,...

  • C语言位运算

    C语言位运算_C语言中文网 C语言位域(位段)_C语言中文网

  • C语言中的位运算

    C语言中的位运算 结构体是唯一一种允许控制内存位(bit)的数据结构,称作位域(Bit Field) 位域不能离开...

  • 巧妙运用C语言位运算

    巧妙运用C语言位运算,C语言是面向过程的,而C++是面向对象的 位运算 位运算的运算分量只能是整型或字符型数据,位...

  • C语言 位运算

    ###位运算的逻辑: 1:(位与)运算符(&):双目操作符,当两个位进行相与时,只有两者都为“1”时结果才为“1”...

  • C语言位运算

    C语言里位运算就是对一个比特(Bit)进行操作,比特(Bit)是计算机的一个电子元件,只有通电和断电两种状态(这也...

  • c语言位运算

  • C语言:按位运算

    C语言:按位运算 C有这些按位运算的运算符& 按位的与| 按位的或~ 按位取反^ 按位的异或<< ...

  • C语言----位域

    为什么使用位域 如果程序的结构中包含多个开关量,只有 TRUE/FALSE 变量,如下: 这种结构需要 8 字节的...

  • 16_位运算符分析

    关键词: C语言中的位运算符、 左移和右移注意点、位运算防错准则、 位运算符和逻辑运算符的区别 1. C语言中的位...

网友评论

      本文标题:C语言笔记(六)---位运算及位域

      本文链接:https://www.haomeiwen.com/subject/yqhzuxtx.html