位操作与位字段

一、位运算符

6种操作运算符

运算符含义运算符含义
&按位与~取反
|按位或<<左移
^按位异或>>右移

取反

~010101
101010

&01
000
101

&01
001
111

亦或

&01
001
110

左移<<

1010 左移 1位 0100

右移>>

1010 右移 1位 0101

位操作

unsigned short var;
对var完成以下操作: bit[0...7]
将bit[7]设置为1: var |= (1<<7);
将bit[7]设置为0: var &= ~(1<<7)
将bit[7]反转: var ^= (1<<7);
将bit[7:4]4个位设置为1: var |= 0xF0; var|=(0xF<<4)
将bit[7:4]4个位设置为0: var &= 0x0F; var &= ~(0xF<<4)
将bit[7:4]4个位反转: var ^= (0xF<<4)
将bit[7:4]设置为1010: var |= (0xa<<4); var&= ~(5<<4);
查看bit[7]的值: (var>>7) & 1
查看bit[7:4]的值: (var>>4) & 0xF
查看bit[6:5]的值: (var>>5) & 0x3

二、位字段

位字段(bit filed)是C语言中一种存储结构,不同于一般结构体的是它在定义成员的时候需要指定成员所占的位数。位字段是一个signed int或unsigned int类型变量中一组相邻的位(C99和C11新增了Bool类型的位字段)。位字段通过一个结构声明来建立,该结构声明为每个字段提供标签,并确定该字段的宽度,例:

struct
{
    unsigned int Sun: 1;
    unsigned int Mon: 1;
    unsigned int Tue: 1;
    unsigned int Wed: 1;
    unsigned int Thur: 1;
    unsigned int Fri: 1;
    unsigned int Sat: 1;
} week;

在上面的这个 星期的结构中,提供了7个1位的字段,每一个字段就代表其中一天。这个就可以通过结构成员运算符点( . )来对每一个字符赋值。

		week.Mon = 1;
        week.Tue = 1;
        week.Wed = 1;
        week.Thur = 1;
        week.Fri = 1;
        week.Sat = 0;
        week.Sun = 0;

通过结构运算符设置周一到周五的值为1,周末值为0。通过这样的方式可以单独操作字节中的某一位,和单片机中对于寄存器的操作就很类似了。由于每个字段只占了一位,所以字符的值只能是0或者1。还可以将每个字段设置为多个位。

在C语言中规定,如果声明的总位数超过了一个unsigned int 类型的大小,就会用到下一个unsigned int 类型的存储位置,一个字段不允许跨越两个unsigned int之间的边界,编译器会自动移动跨界的字段。保持unsigned int的边界对齐。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值