【问题标题】:Left bit shift operation in CC中的左位移位操作
【发布时间】:2015-02-03 04:09:25
【问题描述】:

我正在尝试移动值为 1111 的变量“a”并将其向左移动,这样我可以获得 1110,这意味着它应该打印数字 14。但是,它正在打印 30。我在想因为它正在移动,但它没有取出最左边的位(11110),但它应该是 1110。这是我的代码。谢谢你。

int main(int argc, char *argv[]) {
unsigned a;
a=0xF;
a=a<<1; 
printf(": %u\n",a);

【问题讨论】:

  • unsigned a != unsigned char a。这个数字实际上是0x[0000]000F(取决于它是 16 位还是 32 位无符号整数)。移位:0x[0000]001E == 30。
  • @EOF 嗯?即使以 8 位精度完成移位,也将是 30
  • @MattMcNabb:是的。我写的时候很累。我坚持认为它不包含任何事实错误,尽管它可能有点误导。

标签: c bits


【解决方案1】:

您的a 变量被声明为unsigned——这意味着它是一个unsigned int,通常有32 位。所以当你把0xF放进去时,它确实包含0x0000000F,或者

00000000000000000000000000001111

二进制。

当你将那个位置向左移动时,它包含

00000000000000000000000000011110

或十进制的 30。 (0x1e 十六进制)

如果您想将其限制为仅 4 位,您需要在每次移位操作后使用 0xF AND 结果,例如

a = a << 1;
a = a & 0xF;

这将导致 a 仅包含 1110(但实际上包含 00000000000000000000000000001110

【讨论】:

    【解决方案2】:

    首先,unsignedunsigned int 的缩写,在大多数现代系统上,int 被定义为 4 个字节(32 位)。无论如何,肯定不止 4 位。

    你是对的,“它不会把最左边的部分去掉”。

    如果你愿意,你可以按位 &amp;0xF 这会将最后 4 位左侧的任何位设置为 0

    a = (a << 1) & 0xF;
    

    【讨论】:

      【解决方案3】:

      当你左移一个数字时,最左边的位不会被丢弃,它只是向左移动。因此,当您左移 1111 时,您将得到 11110。为方便起见,您可以记住,当您左移一个数字时,它乘以 2,而当您右移时,实际上是除以 2。下降只会发生如果您为该数字分配的位类型用完。在这种情况下,您将得到垃圾值作为答案。所以你的输出在你正在做的事情的上下文中是正确的。但是如果你想从 15 中得到 14,我建议你使用减法。

      【讨论】:

        【解决方案4】:

        将 1111 向左移动会得到 11110,这确实是 30。尝试阅读相关问题的这个非常好的答案,我认为您对移位有错误的想法。 What are bitwise shift (bit-shift) operators and how do they work?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-17
          • 1970-01-01
          • 2012-04-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多