!与~,&与&&,|与||,>>、<<以及^
- !与~
- !逻辑运算符,只有 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 。