Прежде всего, сделайте себе одолжение и создайте вспомогательные методы.Затем сконцентрируйтесь только на том, чтобы сделать их правильными:
public static boolean contains(int set, int value) {
//return true if value bit is 1 in set
}
public static int add(int set, int newValue) {
//add newValue to set and return it
}
После этого вы сможете выразить свою логику более четко:
if ( contains(set, 1) ) {
//print 1
}
Некоторые общие советы:
Не используйте Math.pow()
, поскольку это сделано для чисел с плавающей точкой.Чтобы получить степень 2 как целое число, используйте сдвиг битов:
int maskForValue = 1 << value;
Чтобы проверить, установлен ли определенный бит, найдите маску для этого бита и используйте &
.Это обнуляет все биты, за исключением проверяемого вами бита.
boolean setContainsValue = (set & maskForValue) != 0;
Чтобы установить бит в поле битов, найдите маску для этого бита и используйте |
.Это гарантирует, что этот бит станет 1
.
set = set | maskForValue;
Edit
Что касается вашей прямой проблемы, взгляните на это:
for (int i = 1; i <= elementsSetB; i++)
{
System.out.println ("Please enter integer number " + i + " in set B: ");
setB = in.nextInt ();
}
Вы каждый раз перезаписываете setA
и setB
.В конце, setA
и setB
будут содержать последнее значение, указанное пользователем.Затем, позже, вы делаете это:
for (int i = 0; i <=9; i++)
setB |= (int)pow(2.0, i-1);
, который просто игнорирует вводимые пользователем данные и перезаписывает все биты 0-9 (хотя небезопасно!).Поэтому, конечно, то, что вводит пользователь, не имеет значения.
Избавьтесь от последнего для циклов и затем сохраните входные данные следующим образом (используя вспомогательные методы, которые я описал выше):
for (int i = 1; i <= elementsSetB; i++)
{
System.out.println ("Please enter integer number " + i + " in set B: ");
setB = add(setB, in.nextInt());
}
Править2
У вас, похоже, проблемы с пониманием того, откуда я пришел, с моим представлением об этих "вспомогательных" методах.Если вы впервые работали с методами, имеющими параметры, извините за помутнение проблемы.Но они позволяют вам сосредоточиться на том, чтобы заставить работать одновременно один функционал.Я более подробно остановлюсь здесь на том, что я имею в виду:
public static boolean setContainsValue(int set, int value) {
//return true if the bit string (or bit set) represented by the "set" parameter
//contains the value stored in the "value" parameter
//see the FIRST and SECOND bullet points above for how to do this
}
public static int addValueToSet(int originalSet, int valueToAdd) {
//add the value stored in the "valueToAdd" parameter to the set represented by the
//"originalSet" parameter and return the result
//see the FIRST and THIRD bullet points above for how to do this.
}
Я даже напишу несколько тестов для вас.Методы, описанные выше, не были реализованы должным образом до тех пор, пока по крайней мере все перечисленные ниже значения не будут напечатаны:
int set = 0;
System.out.println( ! contains(set, 1) ); //make sure set doesn't contain 1
set = addValueToSet(set, 1);
System.out.println( contains(set, 1) ); //make sure set now contains 1
System.out.println( !contains(set, 2) ); //make sure set doesn't contain 2
set = addValueToSet(set, 2);
System.out.println( contains(set, 1) ); //make sure set still contains 1
System.out.println( contains(set, 2) ); //make sure set now contains 2