Bitwise operators are used to perform operations at the bit level on integer data types. These operations work on direct manipulation of bits, such as low-level programming, graphics, and cryptography.
List of C++ Bitwise operators
The Bitwise operators supported by C++ language are listed in the following table. Assume variable A holds 60 and variable B holds 13, then
Operator
Description
Example
&
Binary AND Operator copies a bit to the result if it exists in both operands.
(A & B) will give 12 which is 0000 1100
|
Binary OR Operator copies a bit if it exists in either operand.
(A | B) will give 61 which is 0011 1101
^
Binary XOR Operator copies the bit if it is set in one operand but not both.
(A ^ B) will give 49 which is 0011 0001
~
Binary Ones Complement Operator is unary and has the effect of ‘flipping’ bits.
(~A ) will give -61 which is 1100 0011 in 2’s complement form due to a signed binary number.
<<
Binary Left Shift Operator. The left operands value is moved left by the number of bits specified by the right operand.
A << 2 will give 240 which is 1111 0000
>>
Binary Right Shift Operator. The left operands value is moved right by the number of bits specified by the right operand.
A >> 2 will give 15 which is 0000 1111
Example of Bitwise Operators
Try the following example to understand all the bitwise operators available in C++.
Copy and paste the following C++ program in test.cpp file and compile and run this program.
#include <iostream>usingnamespace std;main(){unsignedint a =60;// 60 = 0011 1100 unsignedint b =13;// 13 = 0000 1101int c =0;
c = a & b;// 12 = 0000 1100
cout <<"Line 1 - Value of c is : "<< c << endl ;
c = a | b;// 61 = 0011 1101
cout <<"Line 2 - Value of c is: "<< c << endl ;
c = a ^ b;// 49 = 0011 0001
cout <<"Line 3 - Value of c is: "<< c << endl ;
c =~a;// -61 = 1100 0011
cout <<"Line 4 - Value of c is: "<< c << endl ;
c = a <<2;// 240 = 1111 0000
cout <<"Line 5 - Value of c is: "<< c << endl ;
c = a >>2;// 15 = 0000 1111
cout <<"Line 6 - Value of c is: "<< c << endl ;return0;}
When the above code is compiled and executed, it produces the following result −
Line 1 - Value of c is : 12
Line 2 - Value of c is: 61
Line 3 - Value of c is: 49
Line 4 - Value of c is: -61
Line 5 - Value of c is: 240
Line 6 - Value of c is: 15
Logical operators perform logical operations on Boolean values or expressions. These operators are used to combine two or more conditions and help in decision-making.
Types of Logical Operators
C++ provides three logical operators:
Logical AND (&&)
Logical OR (||)
Logical NOT (!)
1. Logical AND (&&)
The logical AND operator returns true only if both operands are true. If any operand is false, the result is false.
The syntax of logical AND is:
condition_1 && condition 2
2. Logical OR (||)
The logical OR operator returns true if at least one of the conditions is true. If both are false, it returns false.
The syntax of logical OR is:
condition_1 || condition 2
3. Logical NOT (!)
The logical NOT operator negates the given condition. If a condition is true, it returns false and vice versa.
The syntax of logical NOT is:
!condition
Example of Logical Operators
Try the following example to understand all the logical operators available in C++.
Copy and paste the following C++ program in test.cpp file and compile and run this program.
#include <iostream>usingnamespace std;main(){int a =5;int b =20;int c ;if(a && b){
cout <<"Line 1 - Condition is true"<< endl ;}if(a || b){
cout <<"Line 2 - Condition is true"<< endl ;}/* Let's change the values of a and b */
a =0;
b =10;if(a && b){
cout <<"Line 3 - Condition is true"<< endl ;}else{
cout <<"Line 4 - Condition is not true"<< endl ;}if(!(a && b)){
cout <<"Line 5 - Condition is true"<< endl ;}return0;}
When the above code is compiled and executed, it produces the following result −
Line 1 - Condition is true
Line 2 - Condition is true
Line 4 - Condition is not true
Line 5 - Condition is true
In C++, relational operators are used to compare values or expressions. These check the relationship between the operands and return a result in a boolean (true or false).
These comparisons are based on conditions like equality, inequality, greater than, less than, etc.
Relational operators are a fundamental part of a programming language as they help in decision-making, loops, and conditional checks.
List of Relational Operators
This is the following list of the relational operators in C++ −
Equal to (==) − It checks if two values are equal.
Not equal to (!=) − It checks if two values are not equal.
Greater than (>) − It checks if the left operand is greater than the right.
Less than (<) − It checks if the left operand is less than the right.
Greater than or equal to (>=) − It checks if the left operand is greater than or equal to the right.
Less than or equal to (<=) − It checks if the left operand is less than or equal to the right.
Relational Operators Usage
Relational operators are used to compare two values or objects in C++. Here we will see the list of following, where relational operators can be used.
Comparing Integers − It can be used for comparing integer data types like int, long, short, etc.
Comparing Floating-Point Numbers − Relational operators can also be used to compare floating-point numbers (float, double, etc.). However, due to precision issues with floating-point arithmetic, the results may not always be as expected when dealing with very small or very large numbers.
Comparing Characters and Strings − Relational operators compare characters based on their ASCII values. Strings are objects of the std::string class, and relational operators are overloaded to compare them lexicographically (in alphabetical order).
Comparing Objects (Custom Classes) − In C++, you can overload relational operators for custom objects, allowing you to compare instances of a class based on certain criteria.
Example of Relational Operators
The following is an example of relational operators:
In C++, Relational Operators in conditional statements help the program with decision-making and give results (true or false) based on the result of the comparison.
Syntax for if-else with Relational Operators
Here we will see the syntax for if-else with relational operators.
if(a > b){// a is greater than b}elseif(a == b){// a is equal to b}else{// a is less than b}
Syntax for while Loop with Relational Operators
Here we will see the syntax for while loop with relational operators.
int i =1;while(i <=5){if(i <5){// i is less than 5}elseif(i ==5){// i is equal to 5}
i++;}
Relational Operators with Logical Operators
In C++, relational operators (>, <, ==, !=, >=, <=) can be combined with logical operators (&&, ||, !) to form complex expressions, which allow for more advanced decision-making. this is helpful when you need to check multiple conditions in one expression.
Example
#include <iostream>usingnamespace std;intmain(){int age =25, height =180;// Check if age is between 18 and 30 and height is greater than 170if(age >=18&& age <=30&& height >170)
cout <<"The person qualifies!"<< endl;// Check if age is outside 18-30 or height is <= 170if(age <18|| age >30|| height <=170)
cout <<"The person does not qualify!"<< endl;// Check if age is NOT between 18 and 30 or height is NOT > 170if(!(age >=18&& age <=30)||!(height >170))
cout <<"The person does not qualify due to NOT condition!"<< endl;return0;}
Output
The person qualifies!
Limitations of Relational Operators
Precision issues with floating-point comparisons (e.g., float or double types may not behave as expected due to rounding errors).
Comparing non-numeric types (e.g., comparing objects, strings, or custom classes might need custom operator overloads).
Ambiguities in complex expressions where the order of evaluation or operator precedence can lead to unintended results.
Type coercion when using relational operators with mixed data types (e.g., comparing int and double).
Try the following example to understand all the arithmetic operators available in C++.
Copy and paste the following C++ program in test.cpp file and compile and run this program.
#include <iostream>usingnamespace std;main(){int a =21;int b =10;int c ;
c = a + b;
cout <<"Line 1 - Value of c is :"<< c << endl ;
c = a - b;
cout <<"Line 2 - Value of c is :"<< c << endl
;
c = a * b;
cout <<"Line 3 - Value of c is :"<< c << endl ;
c = a / b;
cout <<"Line 4 - Value of c is :"<< c << endl ;
c = a % b;
cout <<"Line 5 - Value of c is :"<< c << endl ;
c = a++;
cout <<"Line 6 - Value of c is :"<< c << endl ;
c = a--;
cout <<"Line 7 - Value of c is :"<< c << endl ;return0;}
When the above code is compiled and executed, it produces the following result −
Line 1 - Value of c is :31
Line 2 - Value of c is :11
Line 3 - Value of c is :210
Line 4 - Value of c is :2
Line 5 - Value of c is :1
Line 6 - Value of c is :21
Line 7 - Value of c is :22
An operator is a symbol that tells the compiler to perform specific mathematical or logical manipulations. C++ is rich in built-in operators and provide the following types of operators −
Arithmetic Operators
Relational Operators
Logical Operators
Bitwise Operators
Assignment Operators
Misc Operators
This chapter will examine the arithmetic, relational, logical, bitwise, assignment and other operators one by one.
Arithmetic Operators
Arithmetic operators in C++ are the basic operators, which are used for basic mathematical or arithmetical operations on operands. These operators are essential for performing calculations and manipulating data within a program.
There are following arithmetic operators supported by C++ language −
Assume variable A holds 10 and variable B holds 20, then −
Operator
Description
Example
+
Adds two operands
A + B will give 30
–
Subtracts second operand from the first
A – B will give -10
*
Multiplies both operands
A * B will give 200
/
Divides numerator by de-numerator
B / A will give 2
%
Modulus Operator and remainder of after an integer division
The following is an example of arithmetic operators −
#include <iostream>usingnamespace std;main(){int a =21;int b =10;int c ;
c = a + b;
cout <<"Line 1 - Value of c is :"<< c << endl ;
c = a - b;
cout <<"Line 2 - Value of c is :"<< c << endl;
c = a * b;
cout <<"Line 3 - Value of c is :"<< c << endl ;
c = a / b;
cout <<"Line 4 - Value of c is :"<< c << endl ;
c = a % b;
cout <<"Line 5 - Value of c is :"<< c << endl ;
c = a++;
cout <<"Line 6 - Value of c is :"<< c << endl ;
c = a--;
cout <<"Line 7 - Value of c is :"<< c << endl ;return0;}
Output
Line 1 - Value of c is :31
Line 2 - Value of c is :11
Line 3 - Value of c is :210
Line 4 - Value of c is :2
Line 5 - Value of c is :1
Line 6 - Value of c is :21
Line 7 - Value of c is :22
Relational Operators
Relational operators are used to compare two values or expressions. These operators return a boolean value − true if the comparison is correct, and else false.
They are essential for making decisions and controlling the flow of a program based on conditions.
There are following relational operators supported by C++ language
Assume variable A holds 10 and variable B holds 20, then −
Operator
Description
Example
==
Checks if the values of two operands are equal or not, if yes then condition becomes true.
(A == B) is not true.
!=
Checks if the values of two operands are equal or not, if values are not equal then condition becomes true.
(A != B) is true.
>
Checks if the value of left operand is greater than the value of right operand, if yes then condition becomes true.
(A > B) is not true.
<
Checks if the value of left operand is less than the value of right operand, if yes then condition becomes true.
(A < B) is true.
>=
Checks if the value of left operand is greater than or equal to the value of right operand, if yes then condition becomes true.
(A >= B) is not true.
<=
Checks if the value of left operand is less than or equal to the value of right operand, if yes then condition becomes true.
(A <= B) is true.
Example
The following is an example of relational operators −
#include <iostream>usingnamespace std;main(){int a =21;int b =10;int c ;if( a == b ){
cout <<"Line 1 - a is equal to b"<< endl ;}else{
cout <<"Line 1 - a is not equal to b"<< endl ;}if( a < b ){
cout <<"Line 2 - a is less than b"<< endl ;}else{
cout <<"Line 2 - a is not less than b"<< endl ;}if( a > b ){
cout <<"Line 3 - a is greater than b"<< endl ;}else{
cout <<"Line 3 - a is not greater than b"<< endl ;}/* Let's change the values of a and b */
a =5;
b =20;if( a <= b ){
cout <<"Line 4 - a is either less than \ or equal to b"<< endl ;}if( b >= a ){
cout <<"Line 5 - b is either greater than \ or equal to b"<< endl ;}return0;}
Output
Line 1 - a is not equal to b
Line 2 - a is not less than b
Line 3 - a is greater than b
Line 4 - a is either less than or equal to b
Line 5 - b is either greater than or equal to b
Logical Operators
Logical operators are used to perform logical operations on boolean values (true or false). These operators are essential for controlling the flow of a program based on conditions. There are three primary logical operators in C++ as mentioned below −
There are following logical operators supported by C++ language.
Assume variable A holds 1 and variable B holds 0, then −
Operator
Description
Example
&&
Called Logical AND operator. If both the operands are non-zero, then condition becomes true.
(A && B) is false.
||
Called Logical OR Operator. If any of the two operands is non-zero, then condition becomes true.
(A || B) is true.
!
Called Logical NOT Operator. Use to reverses the logical state of its operand. If a condition is true, then Logical NOT operator will make false.
!(A && B) is true.
Example
The following is an example of logical operators −
#include <iostream>usingnamespace std;main(){int a =5;int b =20;int c ;if(a && b){
cout <<"Line 1 - Condition is true"<< endl ;}if(a || b){
cout <<"Line 2 - Condition is true"<< endl ;}/* Let's change the values of a and b */
a =0;
b =10;if(a && b){
cout <<"Line 3 - Condition is true"<< endl ;}else{
cout <<"Line 4 - Condition is not true"<< endl ;}if(!(a && b)){
cout <<"Line 5 - Condition is true"<< endl ;}return0;}
Output
Line 1 - Condition is true
Line 2 - Condition is true
Line 4 - Condition is not true
Line 5 - Condition is true
Bitwise Operators
Bitwise operators are used to perform operations at the bit level on integer data types. These operations work on direct manipulation of bits, such as low-level programming, graphics, and cryptography.
Bitwise operator works on bits and perform bit-by-bit operation. The truth tables for &, |, and ^ are as follows −
p
q
p & q
p | q
p ^ q
0
0
0
0
0
0
1
0
1
1
1
1
1
1
0
1
0
0
1
1
Assume if A = 60; and B = 13; now in binary format they will be as follows −
A = 0011 1100
B = 0000 1101
—————–
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
~A = 1100 0011
The Bitwise operators supported by C++ language are listed in the following table. Assume variable A holds 60 and variable B holds 13, then −
Operator
Description
Example
&
Binary AND Operator copies a bit to the result if it exists in both operands.
(A & B) will give 12 which is 0000 1100
|
Binary OR Operator copies a bit if it exists in either operand.
(A | B) will give 61 which is 0011 1101
^
Binary XOR Operator copies the bit if it is set in one operand but not both.
(A ^ B) will give 49 which is 0011 0001
~
Binary Ones Complement Operator is unary and has the effect of ‘flipping’ bits.
(~A ) will give -61 which is 1100 0011 in 2’s complement form due to a signed binary number.
<<
Binary Left Shift Operator. The left operands value is moved left by the number of bits specified by the right operand.
A << 2 will give 240 which is 1111 0000
>>
Binary Right Shift Operator. The left operands value is moved right by the number of bits specified by the right operand.
A >> 2 will give 15 which is 0000 1111
Example
The following is an example of bitwise operators −
#include <iostream>usingnamespace std;main(){unsignedint a =60;// 60 = 0011 1100 unsignedint b =13;// 13 = 0000 1101int c =0;
c = a & b;// 12 = 0000 1100
cout <<"Line 1 - Value of c is : "<< c << endl ;
c = a | b;// 61 = 0011 1101
cout <<"Line 2 - Value of c is: "<< c << endl ;
c = a ^ b;// 49 = 0011 0001
cout <<"Line 3 - Value of c is: "<< c << endl ;
c =~a;// -61 = 1100 0011
cout <<"Line 4 - Value of c is: "<< c << endl ;
c = a <<2;// 240 = 1111 0000
cout <<"Line 5 - Value of c is: "<< c << endl ;
c = a >>2;// 15 = 0000 1111
cout <<"Line 6 - Value of c is: "<< c << endl ;return0;}
Output
Line 1 - Value of c is : 12
Line 2 - Value of c is: 61
Line 3 - Value of c is: 49
Line 4 - Value of c is: -61
Line 5 - Value of c is: 240
Line 6 - Value of c is: 15
Assignment Operators
Assignment operators are used to assign values to variables. These operators allow you to set or update the value stored in a variable.
There are following assignment operators supported by C++ language −
Operator
Description
Example
=
Simple assignment operator, Assigns values from right side operands to left side operand.
C = A + B will assign value of A + B into C
+=
Add AND assignment operator, It adds right operand to the left operand and assign the result to left operand.
C += A is equivalent to C = C + A
-=
Subtract AND assignment operator, It subtracts right operand from the left operand and assign the result to left operand.
C -= A is equivalent to C = C – A
*=
Multiply AND assignment operator, It multiplies right operand with the left operand and assign the result to left operand.
C *= A is equivalent to C = C * A
/=
Divide AND assignment operator, It divides left operand with the right operand and assign the result to left operand.
C /= A is equivalent to C = C / A
%=
Modulus AND assignment operator, It takes modulus using two operands and assign the result to left operand.
C %= A is equivalent to C = C % A
<<=
Left shift AND assignment operator.
C <<= 2 is same as C = C << 2
>>=
Right shift AND assignment operator.
C >>= 2 is same as C = C >> 2
&=
Bitwise AND assignment operator.
C &= 2 is same as C = C & 2
^=
Bitwise exclusive OR and assignment operator.
C ^= 2 is same as C = C ^ 2
|=
Bitwise inclusive OR and assignment operator.
C |= 2 is same as C = C | 2
Example
The following is an example of assignment operators −
#include <iostream>usingnamespace std;main(){int a =21;int c ;
c = a;
cout <<"Line 1 - = Operator, Value of c = : "<<c<< endl ;
c += a;
cout <<"Line 2 - += Operator, Value of c = : "<<c<< endl ;
c -= a;
cout <<"Line 3 - -= Operator, Value of c = : "<<c<< endl ;
c *= a;
cout <<"Line 4 - *= Operator, Value of c = : "<<c<< endl ;
c /= a;
cout <<"Line 5 - /= Operator, Value of c = : "<<c<< endl ;
c =200;
c %= a;
cout <<"Line 6 - %= Operator, Value of c = : "<<c<< endl ;
c <<=2;
cout <<"Line 7 - <<= Operator, Value of c = : "<<c<< endl ;
c >>=2;
cout <<"Line 8 - >>= Operator, Value of c = : "<<c<< endl ;
c &=2;
cout <<"Line 9 - &= Operator, Value of c = : "<<c<< endl ;
c ^=2;
cout <<"Line 10 - ^= Operator, Value of c = : "<<c<< endl ;
c |=2;
cout <<"Line 11 - |= Operator, Value of c = : "<<c<< endl ;return0;}
Output
Line 1 - = Operator, Value of c = : 21
Line 2 - += Operator, Value of c = : 42
Line 3 - -= Operator, Value of c = : 21
Line 4 - *= Operator, Value of c = : 441
Line 5 - /= Operator, Value of c = : 21
Line 6 - %= Operator, Value of c = : 11
Line 7 - <<= Operator, Value of c = : 44
Line 8 - >>= Operator, Value of c = : 11
Line 9 - &= Operator, Value of c = : 2
Line 10 - ^= Operator, Value of c = : 0
Line 11 - |= Operator, Value of c = : 2
Misc Operators
Miscellaneous operators, often abbreviated as “misc operators”, include a variety of operators that dont fit neatly into other categories like arithmetic or logical operators. Here are some common miscellaneous operators and their definitions −
The following table lists some other operators that C++ supports.
Sr.No
Operator & Description
1
sizeofsizeof operator returns the size of a variable. For example, sizeof(a), where a is integer, and will return 4.
2
Condition ? X : YConditional operator (?). If Condition is true then it returns value of X otherwise returns value of Y.
3
,Comma operator causes a sequence of operations to be performed. The value of the entire comma expression is the value of the last expression of the comma-separated list.
4
. (dot) and -> (arrow)Member operators are used to reference individual members of classes, structures, and unions.
5
CastCasting operators convert one data type to another. For example, int(2.2000) would return 2.
6
&Pointer operator & returns the address of a variable. For example &a; will give actual address of the variable.
7
*Pointer operator * is pointer to a variable. For example *var; will pointer to a variable var.
Conditional (Ternary) Operator (?:)
It is a shorthand way to perform a conditional evaluation in C++.
int a =10, b =20;int result =(a > b)? a : b;// result will be 20 because a is not greater than b
cout <<"The greater value is: "<< result << endl;
Output
The greater value is: 20
Sizeof Operator
The sizeof operator returns the size, in bytes, of a variable or data type.
int x =5;
cout <<"Size of int: "<<sizeof(x)<<" bytes"<< endl;
cout <<"Size of double: "<<sizeof(double)<<" bytes"<< endl;
Output
4
8
Bitwise Complement Operator (~)
The bitwise complement operator inverts the bits of its operand.
unsignedint num =5;// Binary: 00000000 00000000 00000000 00000101unsignedint result =~num;// Binary: 11111111 11111111 11111111 11111010
cout <<"Bitwise complement of 5: "<< result << endl;// Outputs a large positive number due to unsigned
Scope Resolution Operator (::)
This operator is used to define the scope of a function or variable, particularly in the context of classes and namespaces.
classMyClass{public:staticint value;};int MyClass::value =10;// Define static member outside the class
cout <<"Static value: "<< MyClass::value << endl;
Output
10
Operators Precedence in C++
Operator precedence determines the grouping of terms in an expression. This affects how an expression is evaluated. Certain operators have higher precedence than others; for example, the multiplication operator has higher precedence than the addition operator −
For example x = 7 + 3 * 2; here, x is assigned 13, not 20 because operator * has higher precedence than +, so it first gets multiplied with 3*2 and then adds into 7.
Here, operators with the highest precedence appear at the top of the table, those with the lowest appear at the bottom. Within an expression, higher precedence operators will be evaluated first.
Category
Operator
Associativity
Postfix
() [] -> . ++ – –
Left to right
Unary
+ – ! ~ ++ – – (type)* & sizeof
Right to left
Multiplicative
* / %
Left to right
Additive
+ –
Left to right
Shift
<< >>
Left to right
Relational
< <= > >=
Left to right
Equality
== !=
Left to right
Bitwise AND
&
Left to right
Bitwise XOR
^
Left to right
Bitwise OR
|
Left to right
Logical AND
&&
Left to right
Logical OR
||
Left to right
Conditional
?:
Right to left
Assignment
= += -= *= /= %=>>= <<= &= ^= |=
Right to left
Comma
,
Left to right
Example
The following is an example of demonstrating operators precedence −
#include <iostream>usingnamespace std;main(){int a =20;int b =10;int c =15;int d =5;int e;
e =(a + b)* c / d;// ( 30 * 15 ) / 5
cout <<"Value of (a + b) * c / d is :"<< e << endl ;
e =((a + b)* c)/ d;// (30 * 15 ) / 5
cout <<"Value of ((a + b) * c) / d is :"<< e << endl ;
e =(a + b)*(c / d);// (30) * (15/5)
cout <<"Value of (a + b) * (c / d) is :"<< e << endl ;
e = a +(b * c)/ d;// 20 + (150/5)
cout <<"Value of a + (b * c) / d is :"<< e << endl ;return0;}
Output
Value of (a + b) * c / d is :90
Value of ((a + b) * c) / d is :90
Value of (a + b) * (c / d) is :90
Value of a + (b * c) / d is :50