В качестве 32-битного значения 5 не равно 0b101.Это 0b0000'0000'0000'0000'0000'0000'0000'0101.
(Хотя эти начальные нули не являются значимыми, по значению , факт, что вы выполняете битОперации делают "ширину" двоичного представления важной.)
Итак, когда вы переворачиваете все биты, вы получаете 0b1111'1111'1111'1111'1111'1111'1111'1010, который действительно является отрицательнымчисло для кодирования дополнения к двум.
Если вы просто хотите перевернуть три младших бита, вы можете использовать маску для этого:
const int y = x ^ 0b111;
Это оставит все остальные биты в покое.