Случайные битовые двойные вопросы - PullRequest
0 голосов
/ 29 июня 2011

Я увидел следующую строку в GTMHTTPFetcher.m из gtm-http-request :

// set min interval to a random value between 1.0 and 2.0 seconds
minRetryInterval_ = 1.0 + ((double)(arc4random() & 0x0FFFF) / (double) 0x0FFFF);
  1. Почему оба операнда оператора деления приводятся к double с?

  2. Что делает & 0x0FFFF?

  3. Работает ли это независимо от порядкового номера системы ?

  4. Как мы можем быть уверены, что 0x0FFFF всегда больше, чем arc4random() & 0x0FFFF? Что если система использует комплимент двоим?

1 Ответ

0 голосов
/ 29 июня 2011
  1. Оба операнда оператора деления приводятся к double с, поскольку minRetryInterval_ - это NSTimeInterval, равное typedef double. Возможно, было бы более разумно вместо этого привести их к NSTimeInterval с.

  2. & 0x0FFFF обнуляет все, кроме крайних правых 16 битов случайного u_int32_t, т.е. unsigned int, сгенерированного arc4random().

  3. Да, это должно работать независимо от порядкового номера системы, поскольку знаменатель, 0x0FFFF, является максимально возможным 16-битовым double, и, таким образом, частное всегда будет меньше или равно 1.

  4. Самый старший бит double - это знаковый бит . В этом случае оба знаковых бита равны 0, поэтому мы можем быть уверены, что частное будет положительным. Кроме того, согласно спецификации для double, 0x0FFFF больше по величине, чем, например, 0x0FFFE.

...