@Override
	public boolean removeAll(IntSet c) {
		if (c == null || c.isEmpty() || isEmpty())
			return false;
		if (c == this) {
			clear();
			return true;
		}
		
		final FastSet other = convert(c);
		final int[] localWords = words; 			// faster
		final int[] localOtherWords = other.words; 	// faster

		// Perform logical (a & !b) on words in common
		boolean modified = false;
		for (int i = Math.min(firstEmptyWord, other.firstEmptyWord) - 1; i >= 0; i--) {
			int before = localWords[i];
			localWords[i] &= ~localOtherWords[i];
			modified = modified || before != localWords[i];
		}
		if (modified) {
			fixFirstEmptyWord();
			size = -1;
		}
		return modified;
	}