これは、一度に 7 ビットをシフトする単純なアキュムレータを使用して非常に簡単に行うことができます。アキュムレータにあるビット数を追跡する必要があります。
符号拡張は、単純な論理左シフトとそれに続く算術右シフト (同じ距離) によって実行でき、最上位ビットを未使用のすべての位置にコピーできます。
byte[] input = new byte[] { 0x46, 0x3A, (byte) 0xDD };
int accumulator = 0;
int bitCount = 0;
for (byte b : input) {
accumulator = (accumulator << 7) | (b & 0x7F);
bitCount += 7;
}
// now sign extend the bits in accumulator
accumulator <<= (32 - bitCount);
accumulator >>= (32 - bitCount);
System.out.println(Integer.toHexString(accumulator));
全体のトリックは、 >>N 演算子がトップビットを N 回複製することです。