Я должен был бы увидеть некоторые примеры, чтобы быть уверенным, но вы можете получить неожиданные значения из-за арифметики с двумя дополнениями. Если число имеет начальные нули (как в случае с 26), оператор ~ перевернет их, чтобы сделать их ведущими, что приведет к отрицательному числу.
Одним из возможных путей решения этой проблемы является использование класса Integer:
int flipBits(int n){
String bitString = Integer.toBinaryString(n);
int i = 0;
while (bitString.charAt(i) != '1'){
i++;
}
bitString = bitString.substring(i, bitString.length());
for(i = 0; i < bitString.length(); i++){
if (bitString.charAt(i) == '0')
bitString.charAt(i) = '1';
else
bitString.charAt(i) = '0';
}
int result = 0, factor = 1;
for (int j = bitString.length()-1; j > -1; j--){
result += factor * bitString.charAt(j);
factor *= 2;
}
return result;
}
У меня сейчас не настроена среда Java для тестирования, но это общая идея. По сути, просто преобразуйте число в строку, обрежьте начальные нули, переверните биты и преобразуйте его обратно в число. Класс Integer может даже иметь какой-то способ разобрать строку в двоичное число. Я не знаю, нужно ли так решать проблему, и, возможно, это не самый эффективный способ сделать это, но это даст правильный результат.
Редактировать: ответ полигенубрикантов на этот вопрос также может быть полезным