Shift运算符和按位或

时间:2010-11-22 07:14:29

标签: c

我有四个字符 CH1,CH2,CH3,CH4。我正在读一个二进制文件。 Que-以下代码表示什么?

int GetLong(FILE * hTTF) 
{
    int ch1 = getc(hTTF);
    int ch2 = getc(hTTF);
    int ch3 = getc(hTTF);
    int ch4 = getc(hTTF);

 if ( ch4 == EOF )
  return( EOF );

 return( (ch1<<24)|(ch2<<16)|(ch3<<8)|ch4 );
}

考虑ch1 ='k',ch2 ='e',ch3 ='r',ch4 ='n'; 告诉我输出,为什么会这样? 我不了解产值。 Que-这个转换是什么(ch1&lt;&lt; 24)|(ch2&lt;&lt; 16)|(ch3&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; 8)| ch4 我们通过这样做了什么?

4 个答案:

答案 0 :(得分:4)

ch [1234]是字符的事实是不相关的:它们只是数值。

认为它是这样的:

ch1 = 0x10;
ch2 = 0x20;
ch3 = 0x30;
ch4 = 0x40;

您的输出值将为十六进制值0x10203040。

答案 1 :(得分:2)

输出的是单个int,其中包含四个字符。你可以这样想:

我的四个字符是:0x00, 0x02, 0x53, 0xEF

ch1&lt;&lt; 24 = 0x 00 000000

ch2&lt;&lt; 16 = 0x00 02 0000

ch3&lt;&lt; 8 = 0x0000 53 00

ch4 = 0x000000 EF

接下来是按位ors。

x | 0 = x
1 | x = 1

所以:

0x00000000
0x00020000
0x00005300
0x000000EF
----------
0x000253EF

答案 2 :(得分:2)

返回值为32位值,其中最重要的8位为ch1,接下来的8位为ch2,依此类推。 <<运算符是左移运算符,因此如果(二进制)

ch1 = 10101010

然后(为便于阅读添加点)

ch1 << 24 = 10101010.00000000.00000000.00000000 

等等。 |运算符是按位 OR 运算符,因此它只是组合了不同的ch值。

答案 3 :(得分:-1)

按步骤分解:

  1. 它从hTTF指向的文件中读取4个8位字节或返回EOF;
  2. 如果它可以读取这4个字节,它会逐位创建一个4字节的值,或者在每次旋转后将4个字节组合在一起。