位运算符
位运算只能对整数进行,可以是整数型变量也可以是被识别为整数类型的字面量。位运算是对该整数实际存储的二进制串的二进制位进行操作,可以进行6种位运算:
运算符 | 作用 |
---|---|
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
~ | 按位取反 |
<< | 左移 |
>> | 右移 |
位运算都不改变操作数本身的值,而是位运算表达式本身的值为进行位运算之后的值,例如:
char a = 0B00101101;
char b = 0B10100110;
char c = a & b; // c == 0B00100100
char d = a | b; // d == 0B10101111
char e = a ^ b; // e == 0B00100100
char f = ~a; // f == 0B11010010
char g = a << 2; // g == 0B10110100,低位补0
char h = a >> 2; // h == 0B00001011,高位补0
char gg = b << 2; // gg == 0B10011000,低位补0
char hh = b >> 2; // hh == 0B11101001,高位补1
左移运算,低位一定补0。右移运算,如果是signed类型则补符号位,unsigned类型则补0,例如:
unsigned char b = 0B10100110;
char hh = b >> 2; // hh == 0B00101001,高位补0
// 虽然b和上面的代码中二进制串相同,但这里b被当作unsinged类型,补0而不是1
如果给出的移位位数为负数,不会反向移位,而是将此负数的二进制串(实际为补码)转化为unsigned正整数再移动相应位数,例如:
unsigned char b = 0B10100110;
char hh = b >> -2; // -2的二进制串为0xFE,对应unsigned整数为254即右移254位,最终结果为0B00000000
赋值运算符
赋值运算符最简单的就是"=",将右边的值赋值给左边的变量,或者用于初始化语句中。C/C++除了有最基本的赋值运算符之外还有扩展的赋值运算符:
= | a = b |
+= | a = (a+b) |
-= | a = (a-b) |
*= | a = (a*b) |
/= | a = (a/b) |
%= | a = (a%b) |
&= | a = (a&b) |
|= | a = (a|b) |
^= | a = (a^b) |
<<= | a = (a<<b) |
>>= | a = (a<<b) |
赋值运算符的左侧必须是可修改的值,也就是变量。对一个常量使用赋值运算符则会报错:不可修改的左值。