有时候我们会看到程序中会用 “>>” 来代替 “/” 的运算,他们之间的关系是什么呢?
如:
int a = 4;
int b = 4;
a = a/2;
b = b>>1;
我们知道,最后a和b的结果相同,都是2
通常,在程序中,如果需要乘(或除)2n,我们都可以使用移位的方式来代替,在大部分的C编译器和单片机编程中,用移位的方法的代码比使用乘除运算得到的代码的效率高。
同时,我们在使用移位运算的时候应该注意一下几点:
- 操作符中的各操作数都必须为整型,且如果右操作数为负值或大于或等于左操作数类型的位数,其结果为没定义。
- 在对有符号数据类型进行移位操作时应注意符号位:
1. 对负数右移:高位补1
-7 >>1
原码:1000 0000 0000 0111
补码:1111 1111 1111 1001
>>1 : 1111 1111 1111 1100 //右移1位,高位补1
原码: 1000 0000 0000 0100 //-4
注意:对于负数,右移和除法运算结果不同, -7/2 =>-3
- 对负数左移:符号位不变,其他位左移,空出位补0
- 对正数右移:所有数右移,高位补0
4>>1
0000 0000 0000 0100
>>1
0000 0000 0000 0010
- 对正数左移:符号位不变,左移后空出位补0