2015-04-25 49 views
0

什麼呢這段代碼的意思是......誰能解釋如何工作的..位運算

sum += (i & (1<<j)) != 0 ? n[j] : 0; 

全碼:

int max = (1 << N)-1; 

    //System.err.println(max); 
    String res = "No"; 
    for (int i = 0; i <= max; i++) 
    { 
    long sum = 0; 
    for (int j = 0; j < N; j++) 
    { 
     sum += (i & (1<<j)) != 0 ? n[j] : 0; 
    } 
    //System.err.println(i + " " + sum); 
    if(sum == m){ 

     res = "Yes"; 
     break; 
    } 

回答

3

假設a = 0011 1100

所以與二元左移運算符(< <)。左操作數值左移了右操作數指定的位數。

A << 2 will give 240 which is 1111 0000 

因此,在你的代碼中有我一個循環,對於j

循環而此行

sum += (i & (1<<j)) != 0 ? n[j] : 0; 

因此,對於你的我= 2第二次迭代和j的第一次迭代= 1

首先左移運算符將左移所有位的一個位置,導致0000 0001 << 1 = 0000 0010 (or 2)

那麼你有一個二進制and比較,這將是我(0000 0010 in binary) & (0000 0010) = 0000 0010 (or 2)

and結果會問,如果它是不同的零。如果這個結果是真的,則sum將會增加n[j]陣列位置中的數字,否則不會增加。

Java有一個if else命令的縮寫版本。一旦你理解它,它的使用是非常容易的。

這是寫:

x ? y : z; 

這裏的問號和冒號將採取命令if和else的地方。 這意味着:

condition ? inCaseOfTrue : elseCase; 
2

有了這個代碼我&(1 < < j)的你我的第j位二進制表示。如果它等於1,那麼你添加n [j]進行求和。 完整的代碼顯示你計算所有可能的總和與選擇數組n的一些elememts;

+0

thnx爲簡短和描述性的答案.. – Subhash