算术与<<操作者

时间:2014-06-15 10:33:19

标签: c++ integer int

c ++新手,知道使用<<例如:

 cout<<"hi";

但以下内容:

 int a = 1<<3;
 cout<<a;

将输出8;我为什么这么问?如何解释&lt;&lt;的使用这里吗?

4 个答案:

答案 0 :(得分:2)

<<运算符在应用于整数时执行bitshift。

二进制的

1是00000001.将它移位三位,得到00001000,即8。

答案 1 :(得分:1)

<<中的{p> 1<<3是按位左移运算符而不是流插入。它会将1向左移三位。

答案 2 :(得分:0)

每个特定操作员所做的操作以及该操作的结果取决于其左侧和右侧的类型/对象的类型,因此期望不同对象的不同结果。如前所述,在这种情况下,它执行一个bitshift,因为当左右两个元素都是int时,这是为该运算符定义的操作。在

的情况下
cout<<"hi";

左边有一个std :: ostream类型,右边有一个std :: string类型,这就是为什么这个操作的结果不同 - &#39;&lt;&lt;&lt;&#39;在这种情况下定义为插入运算符;在两个整数的情况下,它被定义为位移运算符

答案 3 :(得分:0)

int a = 1<<3;

这是真实的&#34; <<运营商。它执行位移。您通常不需要在高级代码中执行此类操作;它可以追溯到过去,早在C ++存在之前,当时只有C并且程序员不得不比现在的世界更频繁地手动修补这些东西。

为了理解发生了什么,你需要知道二进制数是如何工作的。

十进制1依旧保留,二进制相同:

1

现在在它前面画出一些零(这通常会让初学者更容易理解 - 前导零不会改变数字的含义,无论是十进制还是二进制):

...00000001

<<操作将位向左移动:

  moved by 3 positions
       +--+
       |  |
       v  |
...00001000

现在删除前导零:

1000

我们走了。二进制1000是十进制的8(1 * 8 + 0 * 4 + 0 * 2 + 0 * 1)。有关详细信息和有趣的角落案例,请参阅任何优秀的C ++书籍或在线教程。

现在让我们看一下C ++中<<的其他含义:

cout<<"hi";

这是重载运算符。 C ++允许您使用几乎任何内置运算符,并为不同的类赋予它新的含义。语言的标准库与std::ostream完全相同(其中std::cout是一个实例)。意思与位移不再有任何关系。它大致意味着&#34;输出&#34;。

如今,将操作符赋予其与原始操作符完全无关的含义被认为是错误的编程风格。接受使用运算符重载的例子是当新的含义与原始语义有意义时,例如,当您为数学矩阵类重载+-时。但是,当C ++被发明时,这个功能显然被更广泛地使用了。

这就是为什么我们今天仍然坚持<<(和>>)完全不同的含义。事实上,对于很多初学者来说,新语义甚至似乎都掩盖了原始语义(正如你的问题所证明的那样)。