java 中的位运算
Bitwise operations in 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;
}
假设 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;
使用此代码 i & (1 << j) 你得到 jth 位i 的二进制表示。如果它等于 1,则将 n[j] 添加到总和中。
完整代码显示您通过选择数组 n 的一些元素来计算所有可能的总和;
这段代码是什么意思...谁能解释一下这是如何工作的..
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;
使用此代码 i & (1 << j) 你得到 jth 位i 的二进制表示。如果它等于 1,则将 n[j] 添加到总和中。 完整代码显示您通过选择数组 n 的一些元素来计算所有可能的总和;