语言运算符之位运算符(通俗易懂)

1. 位运算符分类

运算符描述功能运算规则
&按位与运算符将参与运算的两数各对应的二进位相与参与运算的两个数,同时为1时,值才为1,否则为0
|按位或运算符将参与运算的两数各对应的二进位相或参与运算的两个数,只要有一个为1,其值就为1
^按位异运算符将参与运算的两数各对应的二进位相异参加运算的两个数,如果两个相应位为“异”(值不同),则该位结果为1,否则为0
<<左移运算符把"<<"左边的运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0a = a << 2 将a的二进制位左移2位,右补0
>>右移运算符把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数。a = a >> 2 将a的二进制位右移2位,左边补0 或补1,看被移动的数是正数还是负数

他们都属于双目运算符

2. 位运算符事例 

2.1  & (按位与运算符)

运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;

即,参与运算的两位数,同时为1时,结果才是1,否则为0

举个栗子:

int a = 60     /* 60 转二进制是  0 0 1 1 1 1 0 0 */

int b = 13     /* 13  转二进制是 0 0 0 0 1 1 0 1 */

根据 “&” 运算符,运算规则进行运算

0 0 1 1 1 1 0 0
0 0 0 0 1 1 0 1 
---------------
0 0 0 0 1 1 0 0

得到的二进制是  0 0 0 0 1 1 0 0 ,然后将该二进制转换成十进制,就是12

即  a & b =12 

小知识:"&" 按位与运算符逻辑跟 "&&" 并运算符逻辑相似,就是条件都满足时,结果才为True 

 2.2  | (按位或运算符)

运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;

即,参与运算的两个对象,只要有一个为1,其值就为1

举个栗子:

int a = 60     /* 60  转二进制是 0 0 1 1 1 1 0 0 */

int b = 13     /* 13  转二进制是 0 0 0 0 1 1 0 1 */

根据 “|” 运算符,运算规则进行运算

0 0 1 1 1 1 0 0
0 0 0 0 1 1 0 1 
---------------
0 0 1 1 1 1 0 1

得到的二进制是  0 0 1 1 1 1 0 1 ,然后将该二进制转换成十进制,就是61

即 a | b = 61 

 小知识:"|" 按位或运算符逻辑跟 "||" 或运算符逻辑相似,只要满足其中一个条件时,结果就为True 

 2.3  ^ (按位异运算符)

运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;

即,参加运算的两个数,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。

举个栗子:

int a = 60     /* 60  转二进制是 0 0 1 1 1 1 0 0 */

int b = 13     /* 13  转二进制是 0 0 0 0 1 1 0 1 */

根据 “^” 运算符,运算规则进行运算

0 0 1 1 1 1 0 0
0 0 0 0 1 1 0 1 
---------------
0 0 1 1 0 0 0 1

得到的二进制是  0 0 1 1 0 0 0 1 ,然后将该二进制转换成十进制,就是49

即 a ^ b = 49 

2.4  << (左移运算符) 

运算规则: a = a << 2 将a的二进制位左移2位,右补0

举个栗子: 

int a = 60     /* 60  转二进制是 0 0 1 1 1 1 0 0 */

将 a 进行左移 2 位,即  int c = a << 2

然后,根据 “<<” 运算符,运算规则进行运算。

左移1位后a = a * 2;

若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。

0 0 1 1 1 1 0 0
-----左移 2 位-------
1 1 1 1 0 0 0 0

---左移1位----
60 * 2

----左移2位-----
60 * 4  = 240  /* 1 1 1 1 0 0 0 0 */

得到的二进制是  1 1 1 1 0 0 0 0 ,然后将该二进制转换成十进制,就是240 

 即 int c = a << 2 ,c = 240

如何理解左移舍弃的高位不包含1,这句话。

举个栗子 ,例如,78<<2 。由上得如,左移2位,相当于78*4 =312

1.接来下进行验证,78的二进制 0 1 0 0 1 1 1 0

      0 1 0 0 1 1 1 0

0 1 0 0 1 1 1 0 0 0

--------------------------

   1 0 0 1 1 1 0 0 0  二进制转10进制就是312。由于高位有1,进行保留。

左移时2位中高位包含1,进行保留,这样计算的结果才是准确的。如果左移出高位都是0,直接都舍弃掉。

再举个栗子,如十进制的54 左移2位。二进制是 0 0 1 1 0 1 1 0

       0 0 1 1 0 1 1 0

 0 0 1 1 0 1 1 0 0 0

-------------------------

       1 1 0 1 1 0 0 0  二进制转换成10进制就是216。由于高位无1,进行舍弃

如上是个人理解。如有错误请多多指教。 

 

2.5 >> (右移运算符) 

运算规则:a = a >> 2 将a的二进制位右移2位。左边补0 或补1,看被移动的数是正数还是负数。正数左补0,负数左补1,右边丢弃。

举个栗子: 

int a = 60     /* 60  转二进制是 0 0 1 1 1 1 0 0 */

将 a 进行右移 2 位,即  int c = a >> 2

然后,根据 “>>” 运算符,运算规则进行运算。

操作数每右移一位,相当于该数除以2。

0 0 1 1 1 1 0 0
-----右移 2 位-------
0 0 0 0 1 1 1 1

-----右移1位-------
60 / 2

-----右移2位--------
60 / 4 = 15  /* 0 0 0 0 1 1 1 1 */

根据正数左补0,负数左补1,得到的二进制是  0 0 0 0 1 1 1 1 ,然后将该二进制转换成十进制,就是15

  即 int c = a >> 2 ,c = 15


参考资料:

按位与运算符 

 Go 语言运算符 | 菜鸟教程 (runoob.com)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我来尝试用通俗易懂语言解释一下。 在 C++ 中,类是一种自定义的数据类型,可以将多个数据和函数封装在一起,形成一个完整的实体。如果我们需要实现一个计数器,可以定义一个类 `Counter`,其中包含一个私有成员变量 `n`,表示计数器的值。 ```cpp class Counter { private: int n; public: // 构造函数 Counter(int num) : n(num) {} // 加法运算符重载函数 Counter operator+(const Counter& c) const { return Counter(n + c.n); } }; ``` 在上面的代码中,我们定义了一个类 `Counter`,其中包含一个私有成员变量 `n`,用于存储计数器的值。我们还定义了一个构造函数,在创建对象时初始化计数器的值。此外,我们还重载了加法运算符 `+`,以实现两个计数器对象的相加操作。 在 `operator+` 函数中,我们通过传入一个常量引用参数 `c`,表示另一个操作数。由于我们不希望改变操作数的值,因此使用了 `const` 关键字进行修饰。接着,在函数体中,我们创建了一个新的 `Counter` 对象,其值为两个操作数的和,然后将其返回。 使用这个类的时候,可以先创建两个 `Counter` 对象,然后使用 `+` 运算符将它们相加,得到一个新的 `Counter` 对象,如下所示: ```cpp Counter c1(5); // 创建计数器对象 c1,初始值为 5 Counter c2(10); // 创建计数器对象 c2,初始值为 10 Counter sum = c1 + c2; // 将 c1 和 c2 相加,得到新的计数器对象 sum ``` 在上面的示例中,我们先创建了两个 `Counter` 对象 `c1` 和 `c2`,分别表示计数器的初始值为 5 和 10。然后,我们使用 `+` 运算符将它们相加,得到一个新的计数器对象 `sum`,其值为 15。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小丫头呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值