kword_t * Kmerizer::canonicalize(kword_t *packed, kword_t *rcpack, size_t *bin) { // copy the words (reverse their order) for (size_t i=0;i<nwords;i++) rcpack[i] = packed[nwords-1-i]; // shift bits from word to word if necessary if (lshift) { for (size_t i=0;i<nwords-1;i++) { rcpack[i] |= rcpack[i+1] << lshift; rcpack[i+1] >>= rshift; } } size_t rcbin = revcomp_8(rcpack[0]); if (rcbin > *bin) return packed; // shift each word by 8 bits rcpack[0] >>= 8; for (size_t i=0;i<nwords-1;i++) { rcpack[i] |= rcpack[i+1] << 56; rcpack[i+1] >>= 8; } if (lshift >= 8) rcpack[nwords-1] |= *bin << (lshift-8); else if (lshift > 0) { rcpack[nwords-2] |= *bin << 56+lshift; rcpack[nwords-1] |= *bin >> lshift; }
inline static uint64_t revcomp_block(uint64_t x) { uint64_t output; unsigned char * p = (unsigned char *) &x; unsigned char * q = (unsigned char *) &output; q[7] = revcomp_8(p[0]); q[6] = revcomp_8(p[1]); q[5] = revcomp_8(p[2]); q[4] = revcomp_8(p[3]); q[3] = revcomp_8(p[4]); q[2] = revcomp_8(p[5]); q[1] = revcomp_8(p[6]); q[0] = revcomp_8(p[7]); return output; }