天天看点

有关移位操作

我们常用的移位操作是<< 和 >> ,分别为左移和右移。

当我们在C语言中有算数移位和逻辑移位两种。

JS中有>>和>>>的区别

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

算数移位:就是区分符号的移位       {c语言中直接是定义char m = 3}

逻辑移位:就是不区分符号的移位   {c语言中用unsigned char m = 3}

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

好了让我们看看算数移位和逻辑移位有什么不同:

例如:

(1)对无符号数3来说,x<<1往左移一位,最左边的位移掉了,最右边的移进来的位补零。变成

00000110,所以结果是6;x>>1往右边移一位,由于是无符号数,所以逻辑右移,最右边一位移掉,

最左边移进来的位补零,变成00000001,所以结果是1。

(2)对于有符号数3来说,x<<1往左移一位,最左边的位移掉了,最右边的移进来的位补零。变成

00000110,所以结果是6;x>>1往右边移一位,由于是有符号数,可能发生逻辑右移,也可能发生算术右移

,这一点,C标准并没有明确地指定是使用逻辑右移还是算术右移。但大多数的机器都使用算术右移,变成

00000001,所以结果还是1。但是请注意,这只是说大多数的机器是这样的,你敢保证自己

不会碰到特殊情况吗?

(3)对于有符号数-3来说,x<<1往左移一位,最左边的位移掉了,最右边的移进来的位补零。变成

11111010,结果是-6。往右移一位,由于是有符号数,可能发生逻辑右移,也可能发生算术右移。

大多数机器使用算术右移,变成11111110,结果是-2。

总结:左移时总是移位和补零。右移时无符号数是移位和补零,此时称为逻辑右移;

而有符号数大多数情况下是移位和补最左边的位(也就是补最高有效位),移几位就补几位,此时称为算术右移。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

补充

1.汇编语言中的逻辑右移(SHR)是将各位依次右移指定位数,然后在左侧补0,算术右移(SAR)是将各位依次右移指定位数,然后在左侧用原符号位补齐。 

2.高级语言右移运算符(>>)是将一个数的二进位全部右移若干位,低位移出部分舍弃,左补0。  

3.高级语言右移和汇编语言中的逻辑右移功能一样,但不同于算术右移

继续阅读