Bitweise NOT-Operator ~

Der Bitweise-NOT-Operator wandelt alle Bits eines Integer-Wertes in ihr Gegenteil um: Aus 0 wird 1 und umgekehrt. Dies entspricht dem sogenannten Einerkomplement.












01001001100101100000001011010010
10110110011010011111110100101101
#include <stdio.h>

void printbinary(int x){
  char str[33]; str[32] = '\0';
  int i = 32;
  while(i){i--; str[i] = (x & 1) + '0'; x>>=1;}
  printf("%s\n", str);
}

int main(){
  int x = 1234567890;
  printbinary( x);
  printbinary(~x);
  return 0;
}

Details

Der Bitweise-NOT-Operator erwartet einen Operanden als rvalue und wird von rechts nach links abgearbeitet. Der Rückgabewert ist ein rvalue, der stets ein Integer-Typ ist.

Der Bitweise-NOT-Operator ist nur für Integer-Werte zulässig. Unter C++ ist zusätzlich auch die Anwendung des Operators auf boolsche Werte erlaubt, welche jedoch vor Anwendung des Operators in einen int umgewandelt werden.

Der Unterschied zwischen der bitweisen und der logischen Variante des NOT-Operators ist für Einsteiger in die Sprache manchmal schwer verständlich. Der Unterschied ist: Die bitweise Variante verändert alle Bits von Werten, die logische Variante verändert 1-Bit-Werte. Selbst nach mehreren Jahren Erfahrung kommt es vor, dass aufgrund der ähnlichen Schreibweise (~ oder !) aus Versehen und ohne es zu merken der falsche Operator verwendet wird. Da zudem in gewissen Fällen (beispielsweise bei der Anwendung des Operators auf den Wert -1) die beiden Operatoren dieselben Ergebnisse liefern, ist dies eine schwer aufzufindende Fehlerquelle, die manchmal einige Stunden Fehlersuche benötigt.

Der Bitweise-NOT-Operator wird häufig für Masken verwendet.