public static long[] xorI(long[] v,long[] o,int off){
  if (off == 0) {
    return xorI(v,o);
  }
  if (off < 0) {
    throw new UnsupportedOperationException("Negative shifts are not supported.");
  }
  final int shiftWords=off >>> LONG_LOG2_SIZE;
  final int shiftBits=off & LONG_LOG2_MASK;
  if (shiftWords >= v.length) {
    return v;
  }
  if (shiftBits == 0) {
    final int end=Math.min(v.length,o.length + shiftWords);
    for (int i=shiftWords; i < end; i++) {
      v[i]^=o[i - shiftWords];
    }
    return v;
  }
  final int unshiftBits=Long.SIZE - shiftBits;
  final int end=Math.min(v.length,o.length + shiftWords) - 1;
  for (int i=end; i > shiftWords; i--) {
    final int src=i - shiftWords;
    v[i]^=(o[src] << shiftBits) | (o[src - 1] >>> unshiftBits);
  }
  v[shiftWords]^=o[0] << shiftBits;
  return v;
}

public static long [ ] xorI ( long [ ] v , long [ ] o , int off ) { if ( off == 0 ) { return xorI ( v , o ) ; } if ( off < 0 ) { throw new UnsupportedOperationException ( "Negative shifts are not supported." ) ; } final int shiftWords = off > > > LONG_LOG2_SIZE ; final int shiftBits = off & LONG_LOG2_MASK ; if ( shiftWords >= v . length ) { return v ; } if ( shiftBits == 0 ) { final int end = Math . min ( v . length , o . length + shiftWords ) ; for ( int i = shiftWords ; i < end ; i ++ ) { v [ i ] ^= o [ i - shiftWords ] ; } return v ; } final int unshiftBits = Long . SIZE - shiftBits ; final int end = Math . min ( v . length , o . length + shiftWords ) - 1 ; for ( int i = end ; i > shiftWords ; i -- ) { final int src = i - shiftWords ; v [ i ] ^= ( o [ src ] << shiftBits ) | ( o [ src - 1 ] > > > unshiftBits ) ; } v [ shiftWords ] ^= o [ 0 ] << shiftBits ; return v ; }
xor o onto v inplace , i . e . v ^ = ( o < < off )
