逻辑,算术按位移位

时间:2010-09-13 17:49:30

标签: c bit-manipulation bit-shift

寻求澄清一些事情。

据我所知,关于算术,逻辑按位移位:

  1. <<同样适用于
  2. >>移位的不同之处在于逻辑移位始终将字节填充为0,而算术移位将使用符号位填充它。
  3. 如何使用C区分它?

    根据我的理解,实际的运算符是相同的<<>>

    命令如何区别:

    int i=1;
    printf ("%d\n", i >> 1); // logical shift
    
    int j=1;
    printf ("%d\n", j >> 1); // arithmetical shift
    

    请告诉我,

1 个答案:

答案 0 :(得分:15)

在非负数的情况下,两种右移都是相同的。只有当要移位的数字为负数时才会出现差异。

实际上,当数字为负时,C标准没有指定>>何时执行逻辑或算术移位,但通常,它执行算术移位。要执行逻辑移位,必须将数字强制转换为相应的无符号类型for example

int x = -2;
int y = x >> 1;    // arithmetic shift.
assert (y == -1);
int z = (unsigned)x >> 1;  // logical shift.
assert (z == 0x7FFFFFFF);