Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 链接提取和插入、括号_C++_Operator Keyword_Iostream - Fatal编程技术网

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;