}
func (bv bvec) IsEmpty() bool {
- for i := int32(0); i < bv.n; i += wordBits {
- if bv.b[i>>wordShift] != 0 {
+ for _, x := range bv.b {
+ if x != 0 {
return false
}
}
}
func (bv bvec) Not() {
- i := int32(0)
- w := int32(0)
- for ; i < bv.n; i, w = i+wordBits, w+1 {
- bv.b[w] = ^bv.b[w]
+ for i, x := range bv.b {
+ bv.b[i] = ^x
}
}
// union
func (dst bvec) Or(src1, src2 bvec) {
+ if len(src1.b) == 0 {
+ return
+ }
+ _, _ = dst.b[len(src1.b)-1], src2.b[len(src1.b)-1] // hoist bounds checks out of the loop
+
for i, x := range src1.b {
dst.b[i] = x | src2.b[i]
}
// intersection
func (dst bvec) And(src1, src2 bvec) {
+ if len(src1.b) == 0 {
+ return
+ }
+ _, _ = dst.b[len(src1.b)-1], src2.b[len(src1.b)-1] // hoist bounds checks out of the loop
+
for i, x := range src1.b {
dst.b[i] = x & src2.b[i]
}
// difference
func (dst bvec) AndNot(src1, src2 bvec) {
+ if len(src1.b) == 0 {
+ return
+ }
+ _, _ = dst.b[len(src1.b)-1], src2.b[len(src1.b)-1] // hoist bounds checks out of the loop
+
for i, x := range src1.b {
dst.b[i] = x &^ src2.b[i]
}