移位操作符操作的是整数,整数在内存中存储的是补码,打印或者使用时,用的原码值
<< >> 二进制位的移动
一.左移操作符 <<
#include <stdio.h> int main() { int a = 5; a = a << 2; // 00000000000000000000000000000101原码 5 // 00000000000000000000000000000101反码 // 00000000000000000000000000000101补码 // 00|00000000000000000000000000010100 20 // 二进制位往左移两位 printf("%d", a); return 0; }
左移的规则:左边的抛弃、右边空缺的补0
二.右移操作符 >>
#include <stdio.h> int main() { int i = -5; i = i >> 2; // 10000000000000000000000000000101 原码 -5 // 11111111111111111111111111111010 反码 // 11111111111111111111111111111011 补码 // 二进制位往右移两位 // 11111111111111111111111111111110|11 补码 // 11111111111111111111111111111101 反码 // 10000000000000000000000000000010 原码 -2 printf("%d", i); return 0; }
右移的规则:
1. 逻辑移位左边用0填充,右边丢弃
2. 算术移位左边用原该值的符号位填充,右边丢弃(现在的编译器一般为第二种移位规则)
*******对于移位计算符,需要注意的是:
它们的操作数必须为整数
用一道练习来加深理解:
不能创建临时变量(第三个变量),实现两个数的交换
#include <stdio.h> int main() { int a = 5; int b = 3; printf("打印前:a=%d,b=%d\n", a, b); a = a ^ b; b = a ^ b;//此时的a = a^b,所以 b = a^b = a^b^b 。此处b^b=0 , b = a^(b^b)= a^0 = a a = a ^ b;//由上可知b = a , a = a^b ,所以a = a^b^b 。此处a^a=0 , a = (a^a)^b = b printf("交换后: a=%d,b=%d\n", a, b); return 0; }