添加位(在C中)

时间:2012-10-13 17:42:10

标签: bit-shift bits

我正在努力换班,我遇到了这个问题 我有两个int:

int x = 1;
int y = 2;

有什么区别:

 x = x << (31 + 1);

 y = y << 31;

我认为结果是一样的(即x和y都等于1),但它们不是......我不明白为什么。 2只是1,“1”位向左移动一个空格。

谢谢!

我的意思是,当我们不能再向左移动时,我们不要回头开始吗?

编辑: 让我澄清一下我的想法:

我们从x = 1开始,所以是:

 00000000 00000000 00000000 00000001

然后我们左移31 + 1(或32)。这给了我们:

 00000000 00000000 00000000 00000001

也是1。

然后我们做y = 2,所以那是

 00000000 00000000 00000000 00000010

我们离开了31,这也给了我们:

 00000000 00000000 00000000 00000001

因此,我们得到x = y = 1.我知道这是错的,但任何人都可以解释为什么???

3 个答案:

答案 0 :(得分:1)

您将转移转动

混淆
  • 转移表示移动所有位并用0填充空白点 或1(取决于价值和/或签名)。

  • 旋转正在移动所有位并用该位填充空白点 最终“垮掉”了。

AFAIK C不支持旋转,但只支持移位(可能是因为平台依赖性?)。 x86汇编程序实现了移位和旋转操作。

可以在此处找到比我更好的解释:http://en.wikibooks.org/wiki/X86_Assembly/Shift_and_Rotate

答案 1 :(得分:0)

  

我的意思是,当我们不能再向左移动时,我们不要回头开始吗?

没有。这种行为称为循环移位,并且移位运算符在C中的工作方式。

(顺便说一句,对我来说,两个表达式都按printf("%d %d\n", 1 << (31 + 1), 2 << 31);得到0,但这不是很有意义,因为有符号整数溢出是未定义的行为。)

答案 2 :(得分:0)

如H2CO3所述,行为未定义。您可以参考C99 6.5.7获取更多信息。此外,this question非常相似,如果不是与您的相同。你也可以在那里找到一些好的信息。

顺便提一下,我的系统将班次调整为32。