From 1db1ce63b7f5e67e274849bb03f541f00bc7f6e2 Mon Sep 17 00:00:00 2001 From: Todd Gruben Date: Fri, 15 Sep 2017 15:27:24 -0500 Subject: [PATCH] optimize intersectionBitmapBitmap --- roaring/roaring.go | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/roaring/roaring.go b/roaring/roaring.go index 602fb9c8b..53c07e347 100644 --- a/roaring/roaring.go +++ b/roaring/roaring.go @@ -2115,24 +2115,12 @@ func intersectArrayBitmap(a, b *container) *container { func intersectBitmapBitmap(a, b *container) *container { output := &container{bitmap: make([]uint64, bitmapN), container_type: ContainerBitmap} - itr0 := newBitmapIterator(a.bitmap) - itr1 := newBitmapIterator(b.bitmap) - va, eof1 := itr0.next() - vb, eof2 := itr1.next() - for { - if eof1 || eof2 { - break - } - if va < vb { - va, eof1 = itr0.next() - } else if va > vb { - vb, eof2 = itr1.next() - } else { - output.add(va) - va, eof1 = itr0.next() - vb, eof2 = itr1.next() - } + for i := range a.bitmap { + v := a.bitmap[i] & b.bitmap[i] + output.bitmap[i] = v + output.n += int(popcount(v)) + } return output }