C++ 链接提取和插入、括号
我试着尝试这些奇怪的行为C++ 链接提取和插入、括号,c++,operator-keyword,iostream,C++,Operator Keyword,Iostream,我试着尝试这些奇怪的行为 int value = 2; cout << (value << 2) << endl; //output is 8 cout << (value >> 2) << endl; //output is 0 int值=2; cout对于流,它们是插入和提取操作符。 否则,它们称为左移位运算符和右移位运算符。 请从中阅读这些 但暂时让我解释一下你的产出 (简短回答:>是右移 长答覆: 计算机中的数字
int value = 2;
cout << (value << 2) << endl; //output is 8
cout << (value >> 2) << endl; //output is 0
int值=2;
cout对于流,它们是插入和提取操作符。
否则,它们称为左移位运算符和右移位运算符。
请从中阅读这些
但暂时让我解释一下你的产出
(简短回答:>
是右移
长答覆:
计算机中的数字通常以二进制形式存储,当你没有10位时,只有2位数字:0和1。在这种数字系统中,0为0,1为1,2为10,因为第一位数字溢出(1后面没有数字),三位数字为11,四位数字为100等等
许多编程语言提供一些作用于数字二进制表示的操作
其中有一些:
- 位和
&
,将数字的每一位解释为一个单独的布尔:
这里您只看到结果集中的第三位设置为1,因为这是前两个数字中唯一设置为1的位
- 位或
|
,这是操作数的独立位的|
操作:
在这里,您可以看到前两个数字中任何一个为1的位的结果中的1位
- 右移
>
,将一个数字的所有位向右移动若干个位置:
- 左移
您在这里的困惑是可以理解的!问题在于两个C++
运算符的性质,
。在语言从C
演变的早期,这两个运算符专门用作所谓的“位移位”运算符,其中,
将位向右移位。因此,对于16位整数,值
,其二进制表示形式为:
00000000000000 10
表达式value>2
将所有位向右移位2处;移位到“底部”(bit#0)之外的任何位都将丢失,右侧的间隙将被零填充。因此,在您的例子中,唯一的1
位将丢失(从末尾脱落),整个value
最终为零
现在,当C++
流的概念出现时,这些流的输入和输出都需要运算符符号(无论是字符串流还是文件流,比如代码中的cout
)运算符
之所以被选中,是因为它们“看起来”像它们实际在做的事情(箭头状的运动指示器)。幸运的是,C++
语言允许为特定类型的变量重新定义任何运算符(称为“运算符重载”)如果您查看
标准标题,您将在ostream
类的定义/声明中看到类似的内容:
ostream和operatorhose就是所谓的运算符。您的困惑可能归结为运算符
的两种截然不同的含义,这取决于它们的运算对象。对于整数,它们是位移位(正如@Blaze所指出的)但是,对于文件流或字符串流,它们是输入/输出操作。@Adrian,这将是一个很好的答案;)那么这样做的目的是什么?
a = 5//(00000101)
a<<1
result is 10(00001010)>// here bit shifted by one position.
a = 5;//(00000101)
The result is 00000010 which is 2
printf("b>>1 = %d\n", b>>1);
00000110
&
00000101
=
00000100
00000110
&
00000101
=
00000111
00110100 >> 2
=
00001101
00000101 << 3
=
00101000
string a = "Hello";
string b = "World";
string c = a + ", " + b;