code: public static void swap(
  		final byte[] data, final int start, final int end,
  		final byte[] otherData, final int otherStart
  	) {
  		for (int i = end - start; --i >= 0;) {
  			final boolean temp = get(data, i + start);
  			set(data, i + start, get(otherData, otherStart + i));
  			set(otherData, otherStart + i, temp);
  		}
  	}
docs: Swap a given range with a range of the same size with another array.
  
  <pre>
  start            end
  |               |
  data:      +---+---+---+---+---+---+---+---+---+---+---+---+
  +---------------+
  +---------------+
  otherData: +---+---+---+---+---+---+---+---+---+---+---+---+
  |
  otherStart
  </pre>
  
  @param data the first byte array which are used for swapping.
  @param start the start bit index of the {@code data} byte array,
  inclusively.
  @param end the end bit index of the {@code data} byte array, exclusively.
  @param otherData the other byte array to swap the elements with.
  @param otherStart the start index of the {@code otherData} byte array.
  @throws IndexOutOfBoundsException if {@code start > end} or
  if {@code start < 0 || end >= data.length*8 || otherStart < 0 ||
  otherStart + (end - start) >= otherData.length*8}