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

		boolean modified = false;
		if (firstEmptyWord > other.firstEmptyWord) {
			modified = true;
			while (firstEmptyWord > other.firstEmptyWord)
				localWords[--firstEmptyWord] = 0;
		}

		// Perform logical AND on words in common
		for (int i = 0; i < firstEmptyWord; i++) {
			int before = localWords[i];
			localWords[i] &= localOtherWords[i];
			modified = modified || before != localWords[i];
		}
		if (modified) {
			fixFirstEmptyWord();
			size = -1;
		}
		return modified;
	}