无法理解这段c ++代码

时间:2016-10-18 14:02:00

标签: c++

我正在阅读一些c ++开源代码和c ++初学者,我发现这段代码很难理解,我不知道这段代码是做什么的,为什么要以这种方式编写代码。任何身体能给我任何线索吗? (问题部分在rndseq[k] = (rndseq[k] << 8) | (rand() & 0xff);)

 static unsigned int rndseq[2048];
    for (k = 0; k < 2048; k++)
    {
                rndseq[k] = 0;
                for (i=0; i < (int)sizeof(int); ++i)
                    rndseq[k] = (rndseq[k] << 8) | (rand() & 0xff);
    }

2 个答案:

答案 0 :(得分:2)

(rndseq[k] << 8) | (rand() & 0xff)

这些是二进制操作,(参见C中的位操作)

可以翻译成

rndseq[k] * 256 + rand() % 256

代码背后的想法是,创建一个包含随机条目的大型数组,但它太复杂了

我希望,这有助于您理解逻辑

    //we want to fill this array with random numbers
    static unsigned int rndseq[2048];
    // for each k-entry of the array
    for (k = 0; k < 2048; k++)
    {
                // initialize k-entry with zero
                rndseq[k] = 0;
                // for each byte in the k-entry integer
                for (i=0; i < (int)sizeof(int); ++i)
                    //on the first iteration rndseq[k] is zero, so  
                    //(rndseq[k] << 8) remains zero. 
                    //(rand() & 0xff) creates a random number in the range [0,255]
                    //-> in the first iteration rndseq[k] will be set to a random number ([0,255])
                    //lets say, you have a int32 (4 bytes)
                    //you need 1 byte to represent 255
                    //so you have 3 "empty" bytes and 1 filled
                    //lets say, rand() got the number 1
                    //than rndseq would have the following value
                    //0x00-0x00-0x00-0x01

                    //in the next iteration you shift 1 byte, so 
                    //you get from (rndseq[k] << 8)
                    //0x00-0x00-0x01-0x00
                    //the next random-number (still 1 byte) (lets say 2)
                    //will be stored in now free last byte
                    //result:
                    //0x00-0x00-0x01-0x02
                    //now you repeat, until all bytes are set
                    //result:
                    //0x01-0x02-0x03-0x04
                    rndseq[k] = (rndseq[k] << 8) | (rand() & 0xff);
    }

答案 1 :(得分:0)

最后我明白了! 我认为代码背后的关键思想是,我们不确定rndseq[k]rand()中有多少位,所以代码用随机的rndseq [k]中的每8位填充一次。 rand() & 0xff表示获取随机数的最后8位,然后使用操作&#34; |&#34;将这8个比特填充到rndseq[k]中的最后8个比特中(先前填充的8比特已被&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; 8)保留for循环用于填充rndseq[k]中的每8位随机。