--- a/sketches/iterator.go
+++ b/sketches/iterator.go
@@ -27,10 +27,12 @@
 	"sync"
 
 	"github.com/shenwei356/bio/seq"
-	"github.com/shenwei356/kmers"
 	"github.com/will-rowe/nthash"
 )
 
+// ErrKOverflow means K > 32.
+var ErrKOverflow = errors.New("kmers: k-mer size (1-32) overflow")
+
 // ErrInvalidK means k < 1.
 var ErrInvalidK = fmt.Errorf("sketches: invalid k-mer size")
 
@@ -56,6 +58,41 @@
 	return &Iterator{}
 }}
 
+func Encode(kmer []byte) (code uint64, err error) {
+	if len(kmer) == 0 || len(kmer) > 32 {
+		return 0, ErrKOverflow
+	}
+
+	var v uint64
+	for _, b := range kmer {
+		code <<= 2
+		v = base2bit[b]
+		// if v > 3 {
+		if v == 4 {
+			return code, ErrIllegalBase
+		}
+		code |= v
+	}
+	return code, nil
+}
+
+func MustRevComp(code uint64, k int) (c uint64) {
+	// for i := 0; i < k; i++ {
+	// 	c = (c << 2) | (code&3 ^ 3)
+	// 	code >>= 2
+	// }
+	// return
+
+	// https://www.biostars.org/p/113640/#9474334
+	c = ^code
+	c = ((c >> 2 & 0x3333333333333333) | (c&0x3333333333333333)<<2)
+	c = ((c >> 4 & 0x0F0F0F0F0F0F0F0F) | (c&0x0F0F0F0F0F0F0F0F)<<4)
+	c = ((c >> 8 & 0x00FF00FF00FF00FF) | (c&0x00FF00FF00FF00FF)<<8)
+	c = ((c >> 16 & 0x0000FFFF0000FFFF) | (c&0x0000FFFF0000FFFF)<<16)
+	c = ((c >> 32 & 0x00000000FFFFFFFF) | (c&0x00000000FFFFFFFF)<<32)
+	return (c >> (2 * (32 - k)))
+}
+
 // Iterator is a kmer code (k<=32) or hash iterator.
 type Iterator struct {
 	s         *seq.Seq // only used for KmerIterator
@@ -739,8 +776,8 @@
 		// iter.codeRC = (iter.codeBase^3)<<(iter.kP1Uint<<1) | (iter.preCodeRC >> 2)
 		iter.codeRC = (iter.codeBase^3)<<(iter.mask2) | (iter.preCodeRC >> 2)
 	} else {
-		code, err = kmers.Encode(iter.kmer)
-		iter.codeRC = kmers.MustRevComp(code, iter.k)
+		code, err = Encode(iter.kmer)
+		iter.codeRC = MustRevComp(code, iter.k)
 		iter.first = false
 	}
 	if err != nil {
