C语言复习整理(十五)——位运算

位运算

一、“按位与”运算符(&)
1、运算规则
参加运算的两个数据,按二进位进行“与”运算,如果两个相应的二进位都为1,则该位的结果值为1,否则为0,即:0&0=0,0&1=0,1&0=0,1&1=1.
2、用途
(1)清零。运算对象:原来的数中为1的位,新数中相应位为0。
(2)取一个数中某些指定位。如想要取一个整数a(占2个字节)的低(高)字节,只需将a与八进制的377(177400)按位与即可。
(3)保留某一个数的某一位。
二、 按位或运算符(|)
1、运算规则
参加运算的两个数据,按二进位进行“或”运算,如果两个相应的二进位都为0,则该位的结果值为0,否则为1,即:0|0=0,0|1=1,1|0=1,1|1=1。
2、用途
对一个数据的某些位定值为1。
三、“异或”运算符(^)
也称XOR运算符。
1、运算规则
若参加运算的两个二进位同号,则结果为0(假);异号则为1(真),即:0 ^ 0=0,0 ^ 1=1,1 ^ 0=1,1 ^ 1=0.
2、用途
(1)使特定位翻转。假设有01111010,想使其低4位翻转,可以将它与00001111进行^运算。
(2)与0相^,保留原值
(3)交换两个值,不用临时变量
假如a=3,b=4。想将a和b的值互换,可以用以下赋值语句实现:a=a ^ b; b=b ^ a; a=a^b;
四、“取反”运算符(~)
1、运算规则
~是一个单目(元)运算符,用来对一个二进制数按位取反,即将0变1,1变0。
2、用途:使一个整数a的最低位为0,可以用:a=a&~1;
五、 左移运算符(<<)
1、运算规则
用来将一个数的各二进位全部左移若干位,右补0,高位左移后溢出,舍弃不起作用。
2、用途:左移一位相当于乘以2
六、 右移运算符(>>)
1、运算规则
用来将一个数的各二进位全部右移若干位,移到右端的低位被舍弃,对无符号数,高位补0;对有符号数,左边移入0(“逻辑右移”)或1(“算术右移”)
2、用途:右移一位相当于除以2

七、位运算赋值运算符
位运算符与赋值运算符可以组成复合赋值运算符,如:&=,|=,>>=,<<=,^=

位段

位段是 C 语言特有的数据结构, 它允许我们定义一个由位组成的段, 并可为它赋以一个名字。
位段的成员必须是int、unsigned int 、signed int、char(属于整型家族)。
位段的成员后边有一个冒号和一个数字(数字代表如果是32位bit位可以使用的权限)。

位段的定义:
struct 名称{
数据类型 变量名 : 所占位数;
数据类型 变量名 :所占位数;
}
位段成员的数据类型应该相同,一般定义为 unsigned int类型,所占位数一般是1,2,4,8,16。
typedef struct _TEST{
unsigned int test1:4;
unsigned int test2:4;
}
printf("%d\n", sizeof(S1)); // 4

1struct S1
{
    int _a : 2;
    int _b : 5;
    int _c : 10;
    int _d : 30;
};
printf("%d\n", sizeof(S1)); // 8

_a 占了2位,_b占了5位,_c占了10位,加起来用了17位,剩余15位,不够存放_d的30位,所以重新开辟一个的int型(32位),并从起始位置开始存放_d。如下图所示: 在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值