2014-10-07 6 views
-1

За этот вопрос http://www.codechef.com/COOK49/problems/SHOOTING/. Я не смог его решить, поэтому я последовал этому решению http://www.codechef.com/viewsolution/4619933. Можете ли вы выполнить эти шагиПочему мы используем побитовый оператор?

int laserNo = lasers.size(); 
int upLasers = 1 << laserNo; 
boolean found = false; 
for (int u=0; u<upLasers; u++) { 
    for (int bit=0; bit<laserNo; bit++) { 
     if ((u&(1<<bit)) != 0) { 
      Point laser = lasers.get(bit); 

и почему мы используем побитовые операторы?

+2

Можете ли вы более четко узнать о деталях, которые вы не понимаете? – Pshemo

+2

Почему люди используют побитовые операторы вообще? Или для решения проблемы? Или вам интересно, что происходит с этим кодом? –

+0

Мы используем побитовые операторы, поскольку они могут позволить нам эффективно использовать весь бит целочисленного значения. –

ответ

0

Этот код использует u для представления набора целых чисел. Каждый бит в двоичном представлении u указывает вам, соответствует ли соответствующий элемент в наборе. Например, чтобы проверить, находится ли 3 в наборе, проверьте, есть ли `u & (1 < < 3)! = 0 '(то есть, если установлен бит 3).

Итерируя от 0 до upLasers - 1, он по существу перебирает все возможные наборы целых чисел от 0 до laserNo.

Вместо этого этот код мог бы использовать BitSet, хотя итерация стала бы намного сложнее (вы, по сути, в конечном итоге эмулируете двоичный приращение).

Производительность и учебная ценность возможны по другим причинам, почему это было сделано таким образом.

+0

Я понимаю, но как это помогает в этом контексте? –

+0

@SiddharthSuresh См. Редактирование. –

+0

Большое спасибо, это именно то, что я хотел –

Смежные вопросы