移位操作符技巧
目录
一、移位操作符概述
二、左移操作符 (<<)
1、移位规则
2、示例代码
3、运算过程演示
三、右移操作符 (>>)
1、移位规则
逻辑右移
算术右移
2、示例代码
3、运算过程演示
四、重要警告
五、注意事项
一、移位操作符概述
C语言提供了两种移位操作符:
-
<<
左移操作符 -
>>
右移操作符
重要说明:移位操作符的操作数只能是整数类型(包括有符号和无符号整数)。
二、左移操作符 (<<)
1、移位规则
-
将操作数的二进制表示向左移动指定的位数
-
左边超出位被丢弃,右边空出位补0
2、示例代码
#include <stdio.h>int main()
{int num = 10; // 二进制: 0000 1010 (假设int为8位)int n = num << 1; // 左移1位: 0001 0100 (20)printf("n = %d\n", n); // 输出: 20//原始值 (10): 00001010//左移1位后: 00010100 (20)printf("num = %d\n", num); // 输出: 10 (原值不变)return 0;
}
3、运算过程演示
三、右移操作符 (>>)
1、移位规则
右移操作分为两种类型,具体使用哪种取决于编译器和数据类型:
逻辑右移
-
左边用0填充
-
右边丢弃超出位
算术右移
-
左边用原值的符号位填充(保持符号不变)
-
右边丢弃超出位
注意:对于无符号整数,右移总是逻辑右移;对于有符号整数,通常是算术右移,但这由编译器决定。
2、示例代码
#include <stdio.h>int main()
{int num = 10; // 二进制: 0000 1010int n = num >> 1; // 右移1位: 0000 0101 (5)printf("n = %d\n", n); // 输出: 5//逻辑右移 (10): 00001010 → 00000101 (5)//算术右移 (-10): 11110110 → 11111011 (-5) [假设补码表示]printf("num = %d\n", num); // 输出: 10 (原值不变)return 0;
}
3、运算过程演示
四、重要警告
警告⚠⚠:不要移动负数位,这是C标准未定义的行为,会导致不可预测的结果。例如:
int num = 10;
num >> -1; // 错误!未定义行为
五、注意事项
-
移位操作不会改变原变量的值,除非进行自移位操作(如
num <<= 1
) -
移动的位数不应超过或等于数据类型的位数(如32位int不应移动32位或更多)
-
右移有符号负数时结果依赖于实现(通常是算术右移)
-
移位操作常用于高效的乘除2的幂次方运算,但要注意溢出问题