Как уже отмечали другие, есть два способа отрицать что-то: "lvalue =! Lvalue;" и "lvalue ^ = 1;". Важно признать различия.
Если сказать "lvalue =! Lvalue", lvalue будет установлен на 1, если он был равен нулю, и на 0, если он был установлен на что-нибудь еще . Lvalue будет оцениваться дважды; это не является фактором для простых переменных, но выражение "someArray [index1] [index2] [index3] [index4] =! someArray [index1] [index2] [index3] [index4]" может замедлить процесс.
Сказать "lvalue ^ = 1;" приведет к тому, что для lvalue будет установлено значение 1, если оно было 0, 0, если оно было 1, и что-то еще, если оно не было ни нулевым, ни 1. Значение lvalue необходимо указывать или оценивать только один раз, а если известно, что значение равно нулю или 1, эта форма, скорее всего, будет быстрее.
Жаль, что нет оператора автоматического отрицания; бывают случаи, когда такая вещь будет полезна.