C言C语之位运算

01--按位与运算  &

& 是双目运算符,& 左右参与运算的数各对应的二进制位相与,只有当对应位都为1时,运算后结果为1,否则为0。

例15&3

00001111&00000011 = 00000011   即15&3=3

按位与通常用来对某些位清0或保留某些位,例如把一个数高8位清0而保留低8位:

C&255

02--按位或运算  |

| 是双目运算符,| 左右参与运算的数各对应的二进制位相或,只要对应位有一个为1时,运算后结果为1,否则为0。

例15&3

00001111|00000011 = 00001111   即15|3=15

03--按位异或运算  ^

^ 是双目运算符,^ 左右参与运算的数各对应的二进制位相异或,当两对应的二进位相异时,运算后结果为1,否则为0。

例15^3

00001111^00000011 = 00001100   即15^3=12

04--求反运算符  ~

求反运算符 ~ 为单目运算符,具有右结合性。其功能是对参与运算的数的各二进制位进行按位求反

~15

~(00001111)= 00000000

05--左移运算符  <<

左移运算符<<是双目运算符,其功能是把<<左边的运算数左移<<右边的指定移动的位数,高位丢弃,低位补0。

当a=15,a<<3

00001111 << 3   即01111000   120

06--右移运算符  >>

右移运算符>>是双目运算符,其功能是把>>左边的运算数右移>>右边的指定移动的位数

当a=15,a>>3

00001111 >> 3   即00000001   1

对于有符号数,在右移时,符号位将随同移动。当为整数时,最高位补0,当为负数时,符号位为1,其最高位补0或者1由编译系统决定

07--位域(位段)

为了节省空间,C语言还提供了一种数据结构,称为位域或位段。

位域是把一个字节中的二进位划分为不同的几个区域,并说明每个区域的位数。每个域都有一个域名,允许程序中按域名操作。

位域定义与结构体的定义比较类似,其形式为:

struct 位域结构名

{位域列表};

其中位域列表的形式为:

类型说明符 位域名:位域长度

例如:

struct data

{

int a:3;

int b:5;

int c:8;

}Num;

Num 是data的变量,共占用2个字节,其中位域a占用3位,位域b占用5位,位域c占用8位。

对于位域有以下说明:

1.一个位域必须存储在一个字节当中,不允许跨字节存储。当一个字节剩下的区域不足够放另一个位域时,应从下一个字节起存放该单元

2.由于不能跨字节存放位域,因此一个位域的最大长度不能超过一个字节即8位

3.位域可以无位域名

位域的使用:

位域的使用形式:

位域变量名.位域名

#include"stdio.h"
int main()
{
    struct data
    {
     int a:1;
     int b:3;
     int c:4;
    }num;
    num.a=1;
    num.b=7;
    num.c=15;

 printf("%d,%d,%d\n",num.a,num.b,num.c);

 return 0;
}

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值