位运算符包含按位与(&)、按位或(|)、按位异或(^)、左移(<<)、右移(>>)和按位取反(~)。
以下所有示例均在32位机器中执行的
1. 按位与(&)、按位或(|)、按位异或(^)
操作数以int a = 3;int b = -5为例,对两个操作数分别进行不同的位操作
00000000 00000000 00000000 00000011 - 3补码
10000000 00000000 00000000 00000101 - -5原码
11111111 11111111 11111111 11111010 - -5反码
11111111 11111111 11111111 11111011 - -5补码
(1) 按位与(&):当两个操作数对应的二进制位均为1时,对应的二进制位为1,否则为0
int c = a & b;
000000000 00000000 00000000 00000011 —c的补码(3)
(2)按位或(|):当两个操作数对应的二进制位至少一个为1时,对应的二进制位为1,否则为0
int c = a | b;
11111111 11111111 11111111 11111011 – c的补码
10000000 00000000 00000000 00000100 – c的反码
10000000 00000000 00000000 00000101 – c的原码(-5)
(3)按位异或(^):当两个操作数对应二进制位不同时为1;相同时为0
int c = a ^ b
11111111 11111111 11111111 11111000 – c的补码
10000000 00000000 00000000 00000111 –c的反码
10000000 00000000 00000000 00001000 – c的原码(8)
按位异或的特点(a^a = 0,0^a = a)
练习题(在不创建临时变量的前提下,实现两个数的交换)
int a = 3;
int b = 5;
printf("交换前:a = %d,b = %d\n", a, b);
a = a ^ b; //a = 3^5
b = a ^ b; //3^5^5 --> b = 3
a = a ^ b; //3^5^3 --> a = 5
printf("交换后:a = %d,b = %d\n", a, b);
2. 左移(<<)、右移(>>)
移位操作符的操作数只能是整数
(1)左移操作符<<:将第一个操作数按位向左移动, 移动位数由第二个操作数指定,右边腾空位补0
以int a = 7;int b = a << 1;为例

图1 左移操作符图示
结果b=14
(2)右移操作符>>:分为算术移位和逻辑移位两种,将第一个操作数按位向右移动, 移动位数由第二个操作数指定,左边腾空位有两种补位方法,第一种补原符号位,第二种补0
算术移位:左边腾空位补原符号位
以int a = 7;int b = a >> 1为例
逻辑移位:左边腾空位补0
以int a = 7;int b = a >> 1为例

图2 右移操作符图示
3.取反操作符(~)
操作数二进制序列中0置1,1置0
以int a = 0;b = ~a;为例
00000000 00000000 00000000 00000000 – 0补码
11111111 11111111 11111111 11111111 – b的补码
10000000 00000000 00000000 00000000 – b的反码
10000000 00000000 00000000 00000001 – b的原码(-1)
1865

被折叠的 条评论
为什么被折叠?



