位操作符包括:
1、& //按位与
2、| //按位或
3、^ //按位异或
4、~ //按位取反
注:上述操作符均是对补码的二进制位进行运算
1、& 按位与
首先上代码:
int main()
{
int a = 6;
int b = -7;
int c = a & b;
printf("%d\n", c);
return 0;
}
上述代码的运行结果为:0
原因如下:
按位与& 操作符的运算规则是:对应的二进制位,有0则为0,两个同时为1,则为1
6的补码:00000000 00000000 00000000 00000110
-7的原码:10000000 00000000 00000000 00000111
-7的反码:11111111 11111111 11111111 11111000
-7的补码:11111111 11111111 11111111 11111001
6 和 -7 补码对应的二进制位有 0 则为 0 ,对应位置都为 1 才为 1
6 的补码: 00000000 00000000 00000000 00000110
-7 的补码: 11111111 11111111 11111111 11111001
6&(-7)的补码: 00000000 00000000 00000000 00000000
6&(-7)的原码: 00000000 00000000 00000000 00000000
因此打印的结果为 0
2、| 按位或
代码案例:
int main()
{
int a = 6;
int b = -7;
int c = a | b;
printf("%d\n", c);
return 0;
}
上述代码的运行结果为:- 1
原因如下:
按位或 | 操作符的运算规则是:对应的二进制位,只要有 1 就是 1 ,两个同时为 0 才为 0
由上文知:
6 的补码: 00000000 00000000 00000000 00000110
-7 的补码: 11111111 11111111 11111111 11111001
6|(-7)的补码: 11111111 11111111 11111111 11111111
6|(-7)的原码:10000000 00000000 00000000 00000001
因此打印的结果为 - 1
3、^ 按位异或
代码案例:
int main()
{
int a = 6;
int b = -7;
int c = a ^ b;
printf("%d\n", c);
return 0;
}
上述代码的运行结果为:- 1
原因如下:
按位异或 ^ 操作符的运算规则是:对应的二进制位,相同为0,相异为1
6 的补码: 00000000 00000000 00000000 00000110
-7 的补码: 11111111 11111111 11111111 11111001
6|(-7)的补码: 11111111 11111111 11111111 11111111
6|(-7)的原码:10000000 00000000 00000000 00000001
因此打印的结果为 - 1
3、~ 按位取反
一个简单的代码案例:
int main()
{
int a = 0;
printf("%d\n", ~a);
return 0;
}
上述代码的运行结果为:- 1
按位取反 ~ 操作符的运算规则是:将每一位二进制位取反
0 的补码:00000000 00000000 00000000 00000000
按位取反:11111111 11111111 11111111 11111111
原码 :10000000 00000000 00000000 00000001
因此打印的结果为 - 1
4、代码案例(不能创建临时变量(第三个变量),实现两个整数的交换)
不能创建临时变量(第三个变量),实现两个整数的交换
对于这个案例,我们可以想到两种书写代码方式
第一种
int main()
{
int a = 3;
int b = 5;
printf("交换前:a=%d b=%d\n", a, b);
a = a + b;
b = a - b;
a = a - b;
printf("交换后:a=%d b=%d\n", a, b);
return 0;
}
此种代码方式比较容易想到,但是缺陷是,当 a 和 b 两个数的和超过了 int
的最大值,那么将会得到一个错误的结果,代码也就失效了。
第二种
int main()
{
int a = 3;
int b = 5;
printf("交换前:a=%d b=%d\n", a, b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("交换后:a=%d b=%d\n", a, b);
return 0;
}
此种代码不容易被想到,一般用于考察程序员对代码知识的了解程度。
注: 对于此案例,若没有条件限制,那么平时书写代码时更建议使用创建临时变量的方式来书完成代码;因为创建临时变量更加易于阅读,可读性更高并且代码执行效率也会更高。
代码如下:
int main()
{
int a = 3;
int b = 5;
int c = 0;
printf("交换前:a=%d b=%d\n", a, b);
c = a;
a = b;
b = c;
printf("交换后:a=%d b=%d\n", a, b);
return 0;
}