- #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;
- }
- //该片段来自于http://www.codesnippet.cn/detail/220420149351.html
来源: http://www.codesnippet.cn/detail/220420149351.html