【问题标题】:Logical, arithmetical bitwise shifts逻辑、算术位移
【发布时间】:2011-04-11 19:21:48
【问题描述】:

寻求澄清一些事情。

据我了解,关于算术逻辑位移:

  1. << 两者的工作方式相同
  2. >> 移位的不同之处在于逻辑移位总是用 0 填充字节,而算术移位将用符号位填充它。

如何使用 C 区分这一点?

据我了解,实际运营商都是一样的<<,>>

命令之间有何不同:

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

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

请告诉我,

【问题讨论】:

    标签: c bit-manipulation bit-shift


    【解决方案1】:

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

    实际上,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);
    

    【讨论】:

    • 有没有办法强制进行特定的转变。例如,我想 (x>1 以删除“-”符号。
    • @mac:丢弃符号位与取二进制补码中的绝对值不同。
    • @jamesdlin 。完全。不知道我在想什么。谢谢。
    • @KennyTM:是的,进步很大。
    • 你能给我一个算术移位的例子吗?我有点困惑。
    猜你喜欢
    • 1970-01-01
    • 2021-07-08
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 2021-09-23
    相关资源
    最近更新 更多