~ - bitwise NOT (unary complement)

suggest change
#include <iostream>

int main(int argc, char **argv) {
    unsigned char a = 234;  // 1110 1010b  (0xEA)
    unsigned char b = ~a;   // 0001 0101b  (0x15)
    
    std::cout << "a = " << static_cast<int>(a) <<
             ", b = " << static_cast<int>(b) << std::endl;
}
a = 234, b = 21

Why

A bit wise NOT (unary complement) operates on the bit level and simply flips each bit. If it’s a 1, it’s changed to a 0, if it’s a 0, it’s changed to a 1. The bit wise NOT has the same effect as XOR’ing a value against the max value for a specific type:

unsigned char a = 234;  // 1110 1010b  (0xEA)
unsigned char b = ~a;   // 0001 0101b  (0x15)
unsigned char c = a ^ ~0;

The bit wise NOT can also be a convenient way to check the maximum value for a specific integral type:

#include <iostream>

int main(int argc, char **argv) {
    unsigned int i = ~0;
    unsigned char c = ~0;
    
    std::cout << "max uint = " << i << std::endl <<
                 "max uchar = " << static_cast<short>(c) << std::endl;
}
max uint = 4294967295
max uchar = 255

The bit wise NOT does not change the value of the original value and does not have a compound assignment operator, so you can not do a ~= 10 for example.

The bit wise NOT (~) should not be confused with the logical NOT (\!); where a bit wise NOT will flip each bit, a logical NOT will use the whole value to do its operation on, in other words (!1) != (~1)

Feedback about page:

Feedback:
Optional: your email if you want me to get back to you:


Bit operators:
* ~ - bitwise NOT (unary complement)

Table Of Contents
5 Bit operators
8 Arrays
11 Loops
39 Streams
51 Unions
56 Lambdas
60 SFINAE
62 RAII
67 Sorting
84 RTTI
87 Scopes
104 Profiling
107 Recursion
117 Iteration
125 Alignment
134 Semaphore
136 Debugging
139 Mutexes
142 decltype