我正在学习生成一组的所有子集,并尝试转换以下C
程序
#include <stdio.h>
#include <math.h>
void printPowerSet(char *set, int set_size)
{
/*set_size of power set of a set with set_size
n is (2**n -1)*/
unsigned int pow_set_size = pow(2, set_size);
int counter, j;
/*Run from counter 000..0 to 111..1*/
for(counter = 0; counter < pow_set_size; counter++)
{
for(j = 0; j < set_size; j++)
{
/* Check if jth bit in the counter is set
If set then pront jth element from set */
if(counter & (1<<j))
printf("%c", set[j]);
}
printf("\n");
}
}
/*Driver program to test printPowerSet*/
int main()
{
char set[] = {'a','b','c'};
printPowerSet(set, 3);
getchar();
return 0;
}
参考:http://www.geeksforgeeks.org/power-set/
我的代码看起来像
private static void printAllSubsets(final Set<Integer> set) {
final int subsetSize = (int) Math.pow(2, set.size());
for (int counter = 0; counter< subsetSize; counter++) {
for (int i = 0; i<set.size(); i++) {
if(counter & (1 << i)) {
}
}
}
}
但是我在
上遇到了编译错误if(counter & (1 << i))
为Required boolean Found int
如何在此处获得与C代码相同的结果? 我不明白这里的按位操作是怎么回事
由于
答案 0 :(得分:5)
您可以使用
if ((counter & (1 << i)) != 0)
Java期望if
条件中的显式布尔表达式。在C中,!= 0
是隐含的。
顺便说一句,请注意您可以使用
final int subsetSize = (1 << set.size());
而不是使用Math.pow
和投射。