The ~ unary operator is bitwise negation. If you need fewer bits than what fits in an int then you’ll need to mask it with & after the fact.
To flip the k least significant bits, use the right mask.
int flipBits(int n, int k) {
    int mask = 1;
    for (int i = 1; i < k; ++i)
        mask |= mask << 1;
    return ~n & mask;
}
or you can create a mask without loop:
int flipBits2(int n, int k) {
    int mask = (1 << k) - 1;
    return ~n & mask;
}