移位操作符
左移操作符 移位规则:
左边抛弃、右边补0
右移操作符 移位规则:
首先右移运算分两种:
- 逻辑移位 左边用0填充,右边丢弃
- 算术移位 左边用原该值的符号位填充,右边丢弃
警告⚠ : 对于移位运算符,不要移动负数位,这个是标准未定义的。 例如:
int num = 10;
num>>-1;//error
并且左移右移操作符只适用于整型,比如:
int main()
{
int a = 10;
int b = a >> 1;
float c = 4.5f;
c >> 1;//error
return 0;
}
编译器报错。
位操作符
& //按位与
| //按位或
^ //按位异或
注:他们的操作数必须是整数。
看代码学知识:
int main()
{
int a = 3;
int b = -2;
int c = a & b;
//00000000000000000000000000000011 - a的补码
//11111111111111111111111111111110 - b的补码
//00000000000000000000000000000010 - 按位与(只有两个都是1才是1,其他都是0)
//10000000000000000000000000000010 - b的源码
//11111111111111111111111111111101 - b的反码
//11111111111111111111111111111110 - b的补码
int d = a | b;
//00000000000000000000000000000011 - a的补码
//11111111111111111111111111111110 - b的补码
//11111111111111111111111111111111 - 按位或补码(只要有一个1就是1,只有两个零才是0)
//11111111111111111111111111111110 - 补码减一
//10000000000000000000000000000001 //除了符号位,其他位全部取反。
//打印结果是-1
printf("%d", d);
int e = a ^ b;//二进制异或
//异或 - 相同为0,相异为1
//00000000000000000000000000000011
//11111111111111111111111111111110
//11111111111111111111111111111101
//11111111111111111111111111111100 - 减一
//10000000000000000000000000000011 - 打印-3
int k = 15;
a & 1;
a = a >> 1;
//00000000000000000000000000001111
//00000000000000000000000000000001
//00000000000000000000000000000001 - 按位与
//然后向右移>>
//00000000000000000000000000000111
//由此可见,这方法可以判断15的二进制位有多少个1;
return 0;
}
不能创建临时变量(第三个变量),实现两个数的交换。
int main()
{
int a = 10;
int b = 20;
a = a^b;
b = a^b;// 可以理解为 b = a ^ b ^ b = a ^ 0 = a
a = a^b;// a = a ^ b ^ a(因为b里面已经是a得数) a = b;
printf("a = %d b = %d\n", a, b);
return 0;
}
但这个有局限性,可读性差。
由上面的代码可以知道,异或是有交换律的
例如:
a^a = 0;
0 ^a = a;
000
011
011
a ^a ^b = b
a ^b ^ a = b