移位运算符(Shift Operators),单从名字就能看出它的含义。
而且,它还有另一个名字——“位移运算符”,进一步展示出它喷薄欲出的味道。
是的,它的功能就是移动数字的位置。
移位运算符是位操作运算符的一种,用于对二进制的数字进行平移。
1.运算规则
左移<<按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。右移>>同理,区别在于左侧可能用符号位填充(对于带符号整数)或用0填充(对于无符号整数)。
2.数学意义
对于正数和负数,左移n位就相当于乘以2的n次方(在数字没有溢出的前提下)。
例如,整数 x = 4(在二进制中表示为 100),对它执行 x << 1,x的值将变为 8(在二进制中表示为 1000)。
#include <stdio.h>
int main() {
unsigned int x = 4; // 4 在二进制中是 100
x = x << 1; // 现在 x 变成 8,在二进制中是 1000
printf("The value of x after left shift is: %u\n", x); // 输出: 8
return 0;
}
相反,右移n位相当于除以2的n次方(忽略余数)。
3.最大移动位数
规定实际移动的次数是移动次数和32的余数,也就是移位33次和移位1次得到的结果相同。移动long型的数值时,规定实际移动的次数是移动次数和64的余数,也就是 移动66次和移动2次得到的结果相同。
如果你左移一个无符号整数,并且移动的位数超过了该整数类型可以表示的位数,那么结果将是未定义的(在大多数情况下,这会导致“环绕”行为,即最高位被丢弃,最低位被新位填充)。如果你左移一个有符号整数,并且移动的位数超过了该整数类型可以表示的位数减1(因为符号位通常占用一位),那么结果也是未定义的。在实际编程中,应该避免这种情况。