java - java中的位运算

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

最佳答案

假设 a = 0011 1100

二进制左移运算符 (<<) 也是如此。左操作数的值向左移动右操作数指定的位数。

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;

关于java - java中的位运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29869232/

相关文章:

iphone - 显示 iPhone 键盘时调整 UIView 大小,如何操作?

java - 用\$转义$

assembly - 为什么汇编 POPCNTQ 基准测试会比使用整数技巧的 native Go 函数慢?

c - 按位移位使我的程序停止?

java - 如何在 java 中移动 char 数组的值?

python - python中的字节到位操作

java - 如何使用 Google Guice 创建需要参数的对象?

Java.util.Date 比较 ">="

java - isSelected() 不适用于 Selenium 中的单选按钮

generics - 使用 F# 的静态类型参数和编码数字常量