左移位和右移位

来源:互联网 发布:查看sql文件乱码 编辑:程序博客网 时间:2024/04/30 01:34

移位操作只是简单地把一个值的位向左或向右移动。


移位操作符
右移位操作符 >>
左移位操作符 <<


左移位
在左移位中,值最左边的几位被丢弃,右边多出来的几个空位则由0补齐。下面是一个左移位例子。

对于一个数n,左移4位,n<<4。
当n=7时,二进制表示       0000 0111
向左移动4位,空位补0      0111 0000 (十进制为112)

当n=-7时,二进制表示      1000 0111
向左移动4位,空位补0      1111 0000  (第一位为符号位,不变,十进制为-112)

当n=-1时,二进制表示      1000 0001
向左移动4位,空位补0      1001 0000  (第一位为符号位,不变,十进制为-16)

因此左移位时不管是整数还是负数,右边移入的位用0填充,称为逻辑移位。


右移位
右移位有两种情况,一种是跟左移位相同的逻辑移位,即左边移入的位用0填充;另一种是算术移位,左边移入的位由原先该值的符号位决定,符号位为1,则移入的位均为1,符号位为0则移入的位均为0。

下面是右移位的例子
对于一个数n,右移4位,n>>4。
当n=7时,二进制表示为           0000 0111
向右移动4位,空位补0(符号位为0) 0000 0000(十进制为0)

当n=16时,二进制为        0001 0000
向右移动4位,空位补0     0000 0001(十进制为1)

当n为负数时此时向右移位不是简单的将负数的二进制为向右移动,而是将负数存储于内存中的补码向右移动。看下面的例子:

当n=-1时,二进制表示为        1000 0001
                              补码为       1111 1111
        右移四位再补四位后       1111 1111(还是-1的补码)

当n=-2时,二进制表示为         1000 0010
                             补码为         1111 1110
                          右移四位        1111 1111(-1的补码)

当n=-16时,二进制表示为       1001 0000
                              补码为        1111 1111
                          右移四位         1111 1111(-1的补码) 

当n=-32时,二进制表示为        1010 0000
                              补码为         1110 0000
                           右移四位         1111 1110(此时为-2的补码)

注意类似这种形式的移位:
a<<-5
左移-5位表示什么呢?是表示右移5位吗?还是根本不移位?在某台机器上,这个表达式实际执行左移27位的操作。当移位的位数比操作数的位数还要多时,这种行为是未定义的。

原创粉丝点击