#include<stdio.h> /**位运算 / int main(void) { int i = 5; int j = 6; / i = 0101;j=0110 0101 & 0110 -------- 0100 = 4
0&0 = 0
1&0 = 0
0&1 = 0
1&1 = 1
*/
printf("按位与运算 i&j = %d \n",i&j);
/**
i = 0101;j=0110
0101
| 0110
--------
0111 = 7
0|0 = 0
1|0 = 1
0|1 = 1
1|1 = 1
*/
printf("按位或运算 i|j = %d \n",i|j);
/**
i = 0101;j=0110
0101
| 0110
--------
0011 = 12
0^0 = 0
1^0 = 1
0^1 = 1
1^1 = 0
*/
printf("按位亦或运算 i^j = %d \n",i^j);
/**
i = 0101;j=0110
0101
| 0110
--------
0011 = 12
0^0 = 0
1^0 = 1
0^1 = 1
1^1 = 0
*/
printf("按位运算 i^j = %d \n",i^j);
/**
按二进制+1 取反
i = 0000000....0101; j=000000000.....0110
0000000....0101 +1 00000000.....0110 +1
0000000....0110 = 6 00000000.....0111 = 7
-6 -7
**/
printf("按位取反运算 ~i = %d \n",~i);
printf("按位取反运算 ~j = %d \n",~j);
/**
移位运算
i<<2 把i的所有二进制左移2位,右边补0(左移n位,相当于乘以2的n次方)
1)i=i*4;
2)i=i>>2;
2的速度远远大于1的速度。
i=0000000....0101;
i=0000000..010100 -- 0001 0100 = 16+4 = 20
j>>2 把j的所有二进制右移2位,左边补0{左边最高位如果是1就补1,左边最高位是0就补0;符号位不变,左边补上符号位}
(右移n位,相当于除以2的n次方{前提不能溢出,否则数据会丢失})
1)j=j/4;
2)j=j<<2;
2的速度远远大于1的速度。
j=000000000.....0110;
j=000000000.....0001 -- 0000 0001 = 1 = 1
**/
printf("按位左移运算 i<<2 = %d \n",i<<2);
printf("按位右移运算 j>>2 = %d \n",j>>2);
/**
另外java中 >>> 代表无符号移动
忽略了符号位扩展,0补最高位
无符号右移运算符>>> 只是对32位和64位的值有意义
**/
return 0;
}