小白学C++ L7位运算符与表达式

  • C++中按位进行的运算符,简称位运算
  • 在计算机中,数据以二进制的形式储存
    • 每8位(bit)构成一个字节(byte)
    • 每个位具有0或1两种状态中的一种

C++中共包含6种按位运算符:

  • 按位与运算符&
  • 按位或运算符|
  • 异或运算符^
  • 按位取反运算符~
  • 左移运算符<<
  • 右移运算符>>
    Tips:按位运算符只能对字符整型以及数值整型数据类型的常量变量使用,不能对浮点类型数据进行计算。
位与运算符

按位与运算符&对两个操作数按照二进制位进行与运算。
Tips:对于操作数a和b,下表演示了&运算符的工作方式:
在这里插入图片描述
Tips:&运算符只有在两个操作数的对应位同时为1时,才会得到结果1

int A = 60; // 0011 1100
int B = 13; // 0000 1101
cout << "A & B = " << (A & B) << endl;

A & B = 0000 1100

二进制数0000 1100的值为12,故打印结果可得:

A & B = 12

位或运算符

按位或运算符|对两个操作数按照二进制位进行或运算。
Tips:对于操作数a和b,下表演示了|运算符的工作方式:
在这里插入图片描述
Tips:|运算只要在两个操作数的对应位存在1时,就可以得到结果1

int A = 60; // 0011 1100
int B = 13; // 0000 1101
cout << "A | B = " << (A | B) << endl;

A | B = 0011 1101

二进制数0011 1101的值为61,故打印结果可得:

A | B = 61

位异或运算符

位异或运算符^对两个操作数按照二进制位进行异或运算。
Tips:对于操作数a和b,下面的真值表演示了^运算符的工作方式:
在这里插入图片描述
Tips:异或运算在两个操作数的对应位不相同时,会得到结果1;也可以看作是二进制下的无进位相加。

int A = 60; // 0011 1100
int B = 13; // 0000 1101
cout << "A ^ B = " << (A ^ B) << endl;

A ^ B = 0011 0001

二进制数0011 0001的值为49,故打印结果可得:

A ^ B = 49

位取反运算符

C++中,取反运算符~对单个二进制操作数按位进行取反运算。
Tips:二进制位取反规则是0变11变0

int A = 60; // 0011 1100
cout << "~A = " << (~A) << endl;

对A应用取反运算符进行计算,可以得到:

~A = 1100 0011

打印结果可得:

~A = -61

在计算机中,所有的二进制数据都是用补码保存的。

  • 正数的补码就是原码本身
    • 正数变量A的原码为0011 1100,补码同样等于0011 1100
  • 负数的补码是在其原码的基础上,符号位不变其余各位取反然后+1
    • 负数变量~A的原码为1100 0011,补码等于1011 1100 + 1 = 1011 1101,值为-61,故~A = -61

Tips:一个对操作数取反运算的简单规律是:会得到比原先操作数的相反数还小1的结果。

左右移运算符

在C++中,左移运算符<<可以将一个操作数的各二进制位全部左移若干位。

  • 左边多余的二进制位将被丢弃
  • 右边不足的二进制位将被补0
int A = 60; // 0011 1100
cout << "A << 1 = " << (A << 1) << endl;

对A应用左移运算符进行1次位移,可以得到:

A << 1 = 0111 1000

二进制数0111 1000的值为120,故打印结果可得:

A << 1 = 120

Tips:在结果符号位不改变,并且没有超过表示范围的情况下,左移运算符移动了几位,相当于对原操作数进行了几次乘2运算

在C++中,右移运算符>>可以将一个操作数的各二进制位全部右移若干位。

  • 右侧多余的位将会被舍弃
  • 左侧对于无符号数,会在左侧补0
  • 左侧对于有符号数,会用符号位补齐:正数为0,负数为1
int A = 60; // 0011 1100
cout << "A >> 2 = " << (A >> 2) << endl;

对A应用右移运算符进行2次位移,可以得到:

A >> 2 = 0000 1111

二进制数0111 1000的值为120,故打印结果可得:

A >> 2 = 15

Tips:乘除优先于加减优先于赋值运算符,移位优先级高于异或

小结:

  • 按位与运算符&:同时为1时,才会得到结果1
  • 按位或运算符|:存在1时,就可以得到结果1
  • 异或运算符^:不相同时,会得到结果1
  • 按位取反运算符~:0变1,1变0 (比原先操作数的相反数还小1)
  • 左移运算符<<:左移移动几位,相当于进行了几次乘2运算
  • 右移运算符>>:右移移动几位,相当于进行了几次除以2运算

练习:输入三个整数a,b,c,输出a与b或运算的值,再与c与运算的结果。

#include <iostream>
using namespace std; 
int main() {
    int a, b, c;
    cin >> a >> b >> c;
    cout << ((a | b) & c);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值