2014-01-06 2 views
1

Одна из основ компьютерной науки - это знание того, как числа представлены в дополнении 2. Представьте, что вы записываете все числа между A и B включительно в представление дополнений 2, используя 32 бита. Сколько 1 вы запишете?Вопросы интервью

Ввод: Первая строка содержит количество тестовых примеров T (< = 1000). Каждая из следующих T строк содержит два целых числа A и B.

Выход: Выходные линии T, соответствующие каждому тестовому корпусу.

Ограничения: -2^31 < < = А = В = < 2^31 - 1

Пример ввода:

-2 0 
-3 4 
-1 4 

Пример вывода:

63 
99 
37 

Пояснение: Для первого случая -2 содержит 31 1, за которым следует 0, -1 содержит 32 1 и 0 содержит 0 1. Таким образом, общая сумма составляет 63. Во втором случае, ответ 31 + 31 + 32 + 0 + 1 + 1 + 2 + 1 = 99

+0

Быстрый ... кто-нибудь ответить на этот вопрос с логикой? – user3164808

+5

просто ответьте как можно лучше; интервью, как правило, столько же о том, как вы думаете, и если я поймал собеседника, задающего вопрос о интервью в интернете ... плохие вещи. В худшем случае вам нужно 2 вещи; цикл for и метод «подсчет бит» ... Если есть лучший случай: отлично –

+0

Если это те вопросы интервью, которые вы можете найти для позиции развития, я бы, вероятно, потерпел неудачу. Я потерял прикосновение бит и байт на протяжении многих лет, довольно смущающе на самом деле. –

ответ

1
for (int i=1; i<line[0]; i++) 
{ 
    int numOf1s = 0; 
    for (int j=line[i].A; j<=line[i].B; j++) 
    { 
     for (unsigned int n=j; n>0; n>>=1) 
      numOf1s += n & 1; 
    } 
    printf("%d\n",numOf1s); 
} 
Смежные вопросы