2014-10-07 64 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 2014-10-07 20:40:36

+2

爲什麼人們普遍使用按位運算符?或爲解決問題?還是你想知道這個代碼究竟發生了什麼? – 2014-10-07 20:41:02

+0

我們使用按位運算符,因爲它們可以讓我們有效地使用整數值的所有位。 – 2014-10-07 20:42:50

回答

0

此代碼使用u來表示一組整數。 u的二進制表示中的每個位都會告訴您相應的元素是否在集合中。例如,要檢查3是否在集合中,請檢查是否存在!= 0'(也就是說,如果設置了位編號3)。

通過迭代從0到upLasers - 1它實質上遍歷從0到laserNo所有可能的整數集合。

此代碼本來可以使用BitSet,但迭代過程會變得複雜得多(您最終會模擬一個二進制增量)。

性能和指導價值是可能的其他原因爲什麼這樣做。

+0

我明白了,但在這種情況下,這有什麼幫助? – 2014-10-07 20:46:38

+0

@SiddharthSuresh請參閱編輯。 – 2014-10-07 20:53:16

+0

非常感謝,這正是我想要的 – 2014-10-07 21:17:19