2015-04-25 2 views
0

, что делает этот кусок кода в виду ... Может кто-нибудь объяснить, как это работает ..Битовые операции в Java

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 

Так что в вашем коде у вас есть цикл для I и контур для 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; 

Здесь знак вопроса и двоеточие занять место команды, если и еще. Это означает:

condition ? inCaseOfTrue : elseCase; 
2

С помощью этого кода я & (1 < < J) вы получите их битую I в двоичном представлении. И если он равен 1, вы добавляете n [j] для суммирования. Полный код показывает, как вы вычисляете все возможные суммы при выборе некоторых элементов массива n;

+0

thnx для короткого и описательного ответа .. – Subhash

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