4.8位运算符

位运算符作用于整数类型的运算对象,并把运算对象看成是二进制的集合。

位运算符提供检查和设置二进制位的功能

bitsit后讲

位运算符(左结合律)

运算符

功能

用法

~

位求反

~expr

<<

左移

Expr1 <<Expr2

>>

右移

Expr1 >> Expr2

&

位与

Expr & expr

^

位异或

 expr^ expr

|

位或

 expr | expr

Warning: 关于符号位如何处理没有明确的规定,所以强烈建议仅将位运算符用于处理无符号类型

 

移位运算

右侧运算对象一定不能为负,而且值必须严格小于结果的位数,否则会产生未定义的行为。

移出边界的位就被舍弃掉了

//假定char占8位,int占32位

//0233是八进制的字面值

 unsigned char bits = 0233;

10011011

 bits<<8 // bits 提升成int类型,然后向左移动8位

00000000

00000000

10011011

00000000

 bits << 31 //向左移动31位,左边超出的位被丢弃

10000000

00000000

00000000

00000000

 bits >> 3//向右移动3位,最右边3位丢弃掉了

00000000

00000000

00000000

00010011

左移运算符(<<)在右侧插入值为0的二进制位。

右移运算符 (>>)对于无符号类型,在左侧插入值为0的二进制位;如果该运算对象是带符号类型,在左侧插入符号位的副本或值位0的二进制位,环境决定

位求反运算符

位求反运算符(~将运算对象逐位求反后生成一个新值,将0换为1,将1换成0

 usigned char bits = 0227;     10010111

~bits

11111111

11111111

11111111

01101000

char类型运算对象首先提升为int

然后往高位(high order position)加0

然后再反

位与,位或,位异或运算符

 

 unsigned char b1 = 0145;                  01100101

 unsigned char b2 = 2057;                  10101111

 b1 & b2    24个高位都是0

                00100101

 b1 | b2    24个高位都是0

                11101111

 b1 ^ b2    24个高位都是0

                11001010

(&)两个都是1结果是1,否则为0

(|)有一个1就是1,否则为0

(^)有且只有一个1为1,否则为0

使用位运算符

用一个二进制位代表一个学生是否通过

 unsigned long quiz = 0; //我们把这个值当作是位的集合来用

 quiz1有32位

例如:需要对序号27的学生对应的位进行设置

首先创建一个值,该值只有第27位是1其他位都是0

再将这个值与quiz1进行位与运算

运用一个unsigned long类型的整数字面值1再用左移运算符

1UL << 27//生成一个值只有第27位为1

Quiz1 |= 1UL<< 27;//表示学生27通过了测验

Quiz1 &= ~(1UL << 27);//学生27没有通过测验

 bool status = quiz1 & (1UL << 27);//学生27是否通过测试

如果quiz1第27位是1则返回非0 , 否则为0

|=的运算相当于

 quiz1 = quiz1 | 1UL << 27;

移位运算(又叫IO运算符)满足左结合律

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值