C语言--位运算相关

本文详细介绍了C语言中的位运算符及其应用,包括按位与(&)、按位或(|)、按位异或(^)、取反(~)、左移(<<)和右移(>>)。同时,还讲解了如何使用位段来高效地存储多个数据,以及位段定义和引用的重要注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 概述

所谓的位运算是进行二进制位的运算。在系统软件中,常要处理二进制位的问题。
c提供的位运算符有:
& 按位与
| 按位或
^ 按位异或
~ 取反
<< 左移
>> 右移

 

 

&对于将一个单元清零、取一个数中的某些指定位以及保留指定位有很大用途。

 

 

|常用来将一个数的某些位置1.

^判断两个位值,不同为1,相同为0.常用来特定位的反转等。

~常用来配合其它位运算符使用的,常用来设置屏蔽字。

<<将一个数的各二进制位全部左移,高位左移后溢出,舍弃不起作用。左移一位相当于该数乘2,左移n位想当于乘2的n。左移比乘法运算要快的多。


>> 右移时,要注意符号问题。对无符号数,右移时左边高位迁入0,对于有符号数,知道原来符号为0(正数),则左边移入0;如果符号为1(负数),则左边移入0还是1要取决于系统。移入0的称为“逻辑右移”,移入1的称为“算数右移”。





2. 位段
将一个字节分为几段来存放几个信息。所谓位段是以位为单位定义长度的结构体类型中的成员。如:
struct packed-data{
unsigned a:2;
unsigned b:6;
unsigned c:4;
unsigned d:4;
int I;
}data;
其中a,b,c,d分别占2位,6位,4位,4位。I为整型,占4个字节。


对于位段的成员引用如下:
data.a = 2;等,但要注意赋值时,不要超出位段定义的范围。如位段成员a定义为2位,最大值为3,即(11)2,所以data.a = 5;就会取5的两个低位进行赋值,就得不到想要的值了。

 

关于位段的定义和引用,有几点重要说明:

①若某一个段要从另一个字开始存放,可以定义:
unsigned a:1;
unsigned b:2;
unsigned :0;
unsigned c:3;(另一单元)

使用长度为0的位段,作用就是使下一个位段从下一个存储单元开始存放。

②一个位段必须存放在用一个存储单元中,不能跨两个单元。

③可以定义无名位段。如:
unsigned a:1;
unsigned :2;(这两位空间不用)

unsigned b:3;

④位段的长度不能大于存储单元的长度,也不能定义位段数组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值