В связанной заметке шорты и байты обрабатываются одинаково.
byte b =-16; // 1111000
b = (byte)(b>>>1);
System.out.println(b); //prints -8 and not 120
ANDing
с 0xFF
решает проблему
b = -16;
b = (byte)((b&0xFF)>>1);
System.out.println(b); // prints 120 as expected.
Причина в том, что b преобразуется сначала к int, а затем к смещению.
В другой ноте, если n
длинная, почему вы не просто использовали ~n
для переворачивания битов, поскольку это все, что нужно?