java中的按位运算

时间:2015-04-25 18:46:30

标签: java bit-manipulation shift operations

这段代码意味着什么......任何人都可以解释这是如何运作的。

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;
    }

2 个答案:

答案 0 :(得分:3)

我们说a = 0011 1100

因此使用二进制左移位算子(&lt;&lt;&lt;左操作数值向左移动右操作数指定的位数。

A << 2 will give 240 which is 1111 0000

所以在你的代码中你有一个循环的i和一个循环的j

这一行

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

因此,对于i = 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;

答案 1 :(得分:2)

使用此代码 i&amp; (1&lt;&lt; j) 您在二进制表示中得到 第i位 。如果它等于1,那么你将n [j]加到sum上。 完整代码显示您通过选择数组n的元素来计算所有可能的总和;