逻辑运算符与算术运算符的区分
发布日期:2022-02-10 08:11:14 浏览次数:5 分类:技术文章

本文共 1502 字,大约阅读时间需要 5 分钟。

!与~,&与&&,|与||,>>、<<以及^

- !与~

  • !逻辑运算符,只有 0 与 非0 两种可能。
  • ~ 位运算符,在数值的二进制形式上按位取反:0 变成 1 ,1 变成 0 。
int i = 2;int j = ~i;int k = !i;cout << j <<" "<< k;
*最后结果*  -3 0 *分析原因* k = 0:i=2是非0,逻辑取反自然为0。 j = -3: 
2在32位机中表示为二进制补码:00...0010(共32位) 
按位取反:11...1101(共32位)
有符号整型数的解读:符号位为1,是负数。
  将补码转为原码,减1再取反。*(负数原码转为补码的逆操作)*
  结果为:00..0011(共31位)
转化为十进制数结果是 3,加上符号,最终结果为 -3 。

- &&、|| 与 &、|

  • && 是逻辑与,可以理解为 and 的意思。返回结果只有 0(False) 与 1(True)。
  • || 就是逻辑或了,可以理解为 or 的意思。返回结果与上相同。(逻辑运算符返回结果只有 False 与 True,可以联系布尔类型理解)
  • 以上两个运算符两端为表达式。
  • & 是位与运算符,在数值的二进制表示上每一位做与运算,1 & 1 为 1 ,其他情况都为 0 。
  • | 就是位或符,对应就是做或运算了,0 | 0 为 0 ,其他情况为 1。
  • 这两个运算符两端是操作数。
// && 与 ||int a = 1;int b = 2;int yu = a & b;int hu = a | b;cout<< yu <<" "<< hu << endl ;cout<< ((a == b) && (a != b)) <
   
    << ((a == b) || (a != b)) <
   
*最后结果*
0 3
0
1*分析原因*
a = 1 ,也就是“01”; b = 2 ,也就是“10”。
a & b 就是 01 & 10 = 00,所以结果为 0 。
a | b 就是 01 | 10 = 11,所以结果为 3 。
a == b 为False,a != b 为 True。所以相与为 0 ,相或为 1 。

- ^

  • 异或位运算符,相同为 0 ,不同为 1 。
int a = 2;
int b = 4;
int yh = a ^ b;
cout << yh ;
*最后结果*
7*分析结果*
a = 2 也就是  010 。
b = 4 也就是  100 。
异或结果  110 。

- << 与 >>

  • 算术移位主要是用来进行有符号数的倍增和减半。
  • "<<"算术左移:按二进制形式把所有的数字向左移动对应的位数,移出的高位舍弃,低位的空位补0。
  • “>>” 算术右移:按二进制形式把所有的数字向右移动对应的位数,移出的低位舍弃,高位的空位补符号位。 “ 0 ”为正,“ 1 ”为负。
  • 格式都是:待移位的数 运算符 移位的次数
int i = 7;int j = i << 2;int k = i >> 2;cout << j << " " << k ;
*最后结果*
28 1*分析结果*7的二进制形式为: 00...00111;(32位机为例)左移 2 位:00..0011100 转化为十进制为 28 。相当于乘以 2 的平方。右移 2 位:0000...00001 转化为十进制为 1 。相当于除以 2 的平方,得到整型结果。
  • 逻辑移位一般是用于无符号数的倍增和递减。逻辑移位与算术移位的移动方式是一样的,不同的是逻辑移位无论左移还是右移,空位都补 0 。

转载地址:https://blog.csdn.net/qq_45717064/article/details/105505633 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:JDBC复习-PreparedStatement
下一篇:2020-02-26

发表评论

最新留言

逛到本站,mark一下
[***.188.10.18]2022年08月15日 08时16分48秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

最新文章