code: func (f *fragment) unprotectedClearBit(rowID, columnID uint64) (changed bool, err error) {
  	changed = false
  	// Determine the position of the bit in the storage.
  	pos, err := f.pos(rowID, columnID)
  	if err != nil {
  		return false, errors.Wrap(err, "getting bit pos")
  	}
  
  	// Write to storage.
  	if changed, err = f.storage.Remove(pos); err != nil {
  		return false, errors.Wrap(err, "writing")
  	}
  
  	// Don't update the cache if nothing changed.
  	if !changed {
  		return changed, nil
  	}
  
  	// Invalidate block checksum.
  	delete(f.checksums, int(rowID/HashBlockSize))
  
  	// Increment number of operations until snapshot is required.
  	if err := f.incrementOpN(); err != nil {
  		return false, errors.Wrap(err, "incrementing")
  	}
  
  	// Get the row from cache or fragment.storage.
  	row := f.unprotectedRow(rowID)
  	row.clearBit(columnID)
  
  	// Update the cache.
  	f.cache.Add(rowID, row.Count())
  
  	f.stats.Count("clearBit", 1, 1.0)
  
  	return changed, nil
  }
docs: // unprotectedClearBit TODO should be replaced by an invocation of
  // importPositions with a single bit to clear.