移位操作符
移位操作符的操作数只能是整型
左移操作符
规则:左边抛弃,右边补0。
int main()
{
int a = 1; // 00000000 00000000 00000000 00000001
int b = a << 1; // 00000000 00000000 00000000 00000010
return 0;
}
左移操作符一定程度上有放大两倍的效果
但要切记, a <<1 并未改变 a的值。可以类比于 a+1 a没有改变。
右移操作符
右移操作符的规则相对于左移操作符而言还是有一些区别
右移操作符有两种规则,具体使用时采用哪种规则与编译器有关。
算数移位
规则:右边抛弃,左边补符号位。
int main()
{
int a = 10; // 10000000 00000000 00000000 00001010
int b = a >> 1; // 11000000 00000000 00000000 00000101 值为1,073,741,829
return 0;
}
算数移位不会改变符号,而逻辑移位就不一定了
逻辑移位
规则:右边抛弃,左边补0。
int main()
{
int a = 10; // 00000000 00000000 00000000 00001010
int b = a >> 1; // 00000000 00000000 00000000 00000101 值为5
return 0;
}
注:当负数进行逻辑移位时,符号将会改为正号。
对于正数而言,右移一位有 /2 的效果,但对于负数而言却不一定,不建议使用移位代替 / 操作符。
位操作符
按位与 &
规则:同为真时为真,反之为假
按位与 | 1&1=1 | 0&0=0 | 1&0=0 | 0&1=0 |
举个例子
int main()
{
int a = 1; // 00000000 00000000 00000000 00000001
int b = 2; // 00000000 00000000 00000000 00000010
int c = a & b; // 00000000 00000000 00000000 00000000
return 0;
}
按位或 |
规则:存真时便为真,全为假时方为假
按位或 | 1|1=1 | 0|0=0 | 1|0=0 | 0|1=0 |
举个例子
int main()
{
int a = 1; // 00000000 00000000 00000000 00000001
int b = 2; // 00000000 00000000 00000000 00000010
int c = a | b; // 00000000 00000000 00000000 00000011
return 0;
}
按位异或 ^
规则:相同为假,相异为真
按位异或 | 1^1=0 | 0^0=0 | 1^0=1 | 0^1=0 |
举个例子
int main()
{
int a = 1; // 00000000 00000000 00000000 00000001
int b = 2; // 00000000 00000000 00000000 00000010
int c = a ^ b; // 00000000 00000000 00000000 00000011
return 0;
}