我正在阅读一些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);
}
答案 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位随机。