逻辑运算符与算术运算符的区分

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

- !与~

  • !逻辑运算符,只有 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)) <<endl ;
cout<< ((a == b) || (a != b)) <<endl ;
*最后结果*
	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 。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值