java.util.BitSet使えるかも。

途中だけ入れ替えるには、
入れ替えたい桁を0、残したい桁を1にしたmask1
入れ替えたい桁を1、残したい桁を0にしたmask2
を用意。

例
b1 = 00|100111|011
b2 = 11|110101|001
mask1 = 11|000000|111
mask2 = 00|111111|000

でもって
c1 = (b1 & mask1) | (b2 & mask2)
c2 = (b2 & mask1) | (b1 & mask2)
かな。

BitSetのandNotとかorとか使ってもできるだろうし、
64(32)ビット以下ならlongやintを直接ビット演算してもいい。