【问题标题】:Why does shifting this bit evalue to 51为什么将这个位 evalue 移到 51
【发布时间】:2015-03-06 18:43:38
【问题描述】:

我目前正在学习 C++ 考试。练习考试的题目之一是:

这条语句的输出是什么。

cout <<(11>>1)<<1<<endl;

在我看来。 11 持有

的二进制等价物
1011.

将此二进制数右移 1 位使其:

0101

然后将第一个向左移动就可以了

1010 

计算结果为 10。

但是,通过在我的编译器中运行相同的语句,它会显示该数字的计算结果为 51。有人可以向我解释一下吗?

【问题讨论】:

  • 你试过cout &lt;&lt;((11&gt;&gt;1)&lt;&lt;1)&lt;&lt;endl;吗?
  • 不是 51,而是 5 后跟 1。
  • 谢谢大家的回答!我确实觉得人们会否决这个问题非常令人失望。我只是想学习
  • 我希望你学会不要写这样的代码。

标签: c++ bitwise-operators bit-shift


【解决方案1】:

这是由于运算符重载造成的。

cout <<(11>>1)<<1<<endl;
//   ^ output operator
//        ^ right shift
//            ^ output operator

如果你把代码改成这样,那么你的答案就是正确的:

cout << ((11>>1) << 1) <<endl;
// brackets force left shift operator instead of output

【讨论】:

    【解决方案2】:

    cout &lt;&lt; (11&gt;&gt;1) &lt;&lt; 1 &lt;&lt; endl;

    变成

    cout &lt;&lt; 5 &lt;&lt; 1 &lt;&lt;endl;

    &lt;&lt; 的流式含义优先于转换含义。因此它会打印一个 5,然后是一个 1。

    【讨论】:

    • "&lt;&lt; 的流式含义优先于转换含义。"它实际上是the syntacic associativity of operator&lt;&lt; 的结果。如果您将cout 更改为数字对象,您仍然会得到类似7 &lt;&lt; (11&gt;&gt;1) &lt;&lt; 1 == (7 &lt;&lt; (11&gt;&gt;1)) &lt;&lt; 1;
    【解决方案3】:
    int a = (11>>1);
    int b = 1;
    cout << a << b;
    

    清除?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      相关资源
      最近更新 更多