我试图尝试这些iostream怪异的行为。
int value = 2;
cout << (value << 2) << endl; //output is 8
cout << (value >> 2) << endl; //output is 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);
简短的回答:>>
是右移的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;
字符串不是数字,但是您仍然可以使用+
来“添加”(或连接)它们,因为有人已经为+
定义了此类重载。
<<
和>>
发生相同的事情:它们只是重载的移位运算符,定义为分别与cout
和cin
对象一起使用时被调用。
一些需要进一步研究的链接: