引导提取和插入,包围

问题描述 投票:1回答:2

我试图尝试这些iostream怪异的行为。

int value = 2;

cout << (value << 2) << endl; //output is 8
cout << (value >> 2) << endl; //output is 0

那么这里发生了什么?

c++ operator-keyword iostream
2个回答
0
投票

对于流,它们是插入和提取运算符。否则,它们被称为左和右移位运算符。了解这些。但是暂时让我解释一下您的输出。

(<

例如-

 a = 5//(00000101)
 a<<1
result is 10(00001010)>// here bit shifted by one position.

(>>)(右移)取两个数字,右移第一个操作数的位,第二个操作数决定移位的位数。类似地,右移(x >> y)等于将x除以2 ^ y。

a = 5;//(00000101)
The result is 00000010 which is 2
printf("b>>1 = %d\n", b>>1); 

0
投票

简短的回答:>>是右移的bitwise operator

长回答:计算机中的数字通常以二进制形式存储,当您没有10,但只有2位数字时:0和1。在这样的数字系统中,您的0为0,1为1,但是2为10,因为第一位溢出(有在1)后面没有数字,三为11,四为100,等等。

许多编程语言提供了一些对数字的二进制表示起作用的操作。

其中有一些:

  • 位和&,它将数字的每个位解释为一个单独的布尔值:
00000110
&
00000101
=
00000100

这里您只看到结果集中的第三位为1,因为这是前两个数字中唯一被设置为1的位。

  • 位或|,这是对单独的操作数位的||操作:
00000110
&
00000101
=
00000111

在这里,对于前两个数字中任何一个为1的位,您将看到1位结果。

  • 右移>>,它将一个数字的所有位向右移动一些位置:
00110100 >> 2
=
00001101
  • 左移<<,与前一个相同,但是将位向左移动:
00000101 << 3
=
00101000

因此<<>>最初是移位运算符。但是在C ++中,您还有另一个称为operator overloading的功能,该功能可让您针对特定类型重新定义某些运算符的行为。这样的一些示例是operator +用于字符串,允许您使用+来“添加”这样的字符串:

string a = "Hello";
string b = "World";
string c = a + ", " + b;

字符串不是数字,但是您仍然可以使用+来“添加”(或连接)它们,因为有人已经为+定义了此类重载。

<<>>发生相同的事情:它们只是重载的移位运算符,定义为分别与coutcin对象一起使用时被调用。

一些需要进一步研究的链接:

© www.soinside.com 2019 - 2024. All rights reserved.