二进制数的移位运算分为左移和右移两种操作。
1. 左移运算 <<:
- 当进行a << b操作时,意味着将二进制数a向左移动b位,而在其右侧则用0进行填充。
例如,二进制数00000100左移2位后变为00010000,即十进制的4左移两位后等于8。
左移操作中,若舍弃的高位不包含1,则每左移一位就相当于原数乘以2。例如,a << b的值实际上就是a乘以2的b次方。
在实际编程中,a << 1往往比a乘以2的运算速度更快,因此常使用左移代替乘法操作来提高程序效率。
2. 右移运算符 >>:
- 右移操作中,a >> b意味着将二进制数a向右移动b位。
- 右移分为逻辑右移和算术右移两种方式。
(1)逻辑右移:在右移过程中,空出的位置用0来填充。
例如,二进制数00001100逻辑右移两位后变为00000011,即十进制的12逻辑右移两位后等于3。
(2)算术右移:在右移过程中,空出的位置使用符号位进行填充。对于正数,其符号位为0;对于负数,其符号位为1。
例如,正数二进制数00000100算术右移两位后为00000001;负数二进制数10000100算术右移两位后为11111111。
在C语言中,默认的右移运算符是算术右移。
若右移时高位不是1(即作数为正),舍弃的低位不包含1,则每次右移一位相当于原数除以2。a >> b的值相当于a除以2的b次方(取整)。同样地,使用 >> 代替除法运算可以提高程序的执行效率。
- 无论是左移还是右移操作,都需要用特定的位值(0或符号位)来填充移动后的空位。
- 左移过程中始终用零填充右侧空位。
- 右移则分为逻辑右移和算术右移,正数用零填充,负数用符号位填充。
- 左移n位相当于乘以2^n,而右移n位则相当于除以2^n。