Updated April 6, 2023
Definition of Evil Number
Evil number, in its’ binary representation, has even number of bits in switched-on condition or true condition or set to value 1. A bit can have value either 1 or 0 / on or off / true or false conditions. It is an integer and it has positive value only. Zero values in evil numbers follow the Thue-Morse order and that is the reason they are known as Thue-Morse set. Non-evil characters are known as odious numbers though odious has a negative meaning. Even parity is the name given to an evil number’s property in computer parlance.
Logic
Numbers are stored in computer memory in bits. In a byte of memory there are 8 bits. We can store 256 values of 0-255 in one byte. Small numbers up to 255 can be in one byte, numbers up to 65535 can be stored in 2 bytes (word) and higher valued numbers can be stored in long word (4 Bytes), quad word (8 Bytes).
Bit representation
The table below explains a bit map of various numbers and how they are graded as evil numbers or otherwise.
Number | Bit Map | Remarks |
0 | 00000000 | 0 is an evil number. Sum of binary is 0 and 0 is considered to be even (since it does not leave any remainder when divided by 2) |
1 | 00000001 | 1 is not an evil number. Sum of binary is 1 and it is an odd |
3 | 00000011 | 3 is an evil number. Sum of binary is 2 which is even |
4 | 00000100 | Count of bits is 1 and hence 4 is not an evil number. |
5 | 00000101 | 5 is an evil number |
22 | 00010110 | Bit sum is 3. Hence 22 is not an evil number |
39 | 00100111 | 39 is and evil number since the bit sum is even. |
168 | 10101000 | It is not an evil number as the bit count is odd. |
245 | 11110101 | Sigma of bits 6 an even number Hence. 245 is an evil number |
How to check the Evil number?
The steps to compute whether a given number is an evil number or not are as follows.
Accept the number
Determine the number of significant binary positions to be checked for bit map settings.
For example – If the number is 22, bit map is 10110, 5-bit positions need to be checked. For 245, bit map 11110101, 8 bit positions need to be checked.
• Iterate the program for that many times as the no of binary positions and check the binary value for each position.
• The binary value of each position can be computed thru remainder by dividing the scaled-down value of the number by 2
o For number 245 the first binary position ( 20 ) by dividing the number 2 and the remainder gives the result.
o In the next iteration scale down the number by half i.e. number = number/2
o Second binary position (21) can be found out by computing the remainder by dividing the scaled-down value of the number by 2
o By repeating the above 2 steps for rest of the binary positions, the binary values for the entire bit map can be computed.
• Add the binary values of all the positions
• If the added value is even, then the number is evil otherwise, it is an odious number
Example (Python Program)
Code:
# Python Program to check whether a given number is Evil number or not
num =int(input("Number please: ")) #Accept the number
terminate = "N" #Define program variables
y = 0
# Loop to find no of binary
while terminate == "N": # positions
if num%(2**y)==num: #If 2**position > num terminate
terminate = "Y" # (position starts with 0)
break
y = y +1
remctr =0 # Define bit count
for i in range (0, y): # Loop for no of position times
num1 = int(num/2**i) # scaling down the number from
# second iteration onwards
if num1%2 == 1: # Remainder by dividing by 2
remctr = remctr + 1 # Total binary counter
if remctr%2 == 0: #inferring the counter
print (f"The Given number {num} is Evil")
else:
print (f"The Given number {num} is Odious")
Result is:
Example (C++ Program)
The logic is same as that of Python.
Code:
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
int num;
cout<<"Enter the number:";
cin>>num;
string terminate = "N";
int y = 0;
int num1 = 0;
int num2 = 0;
while (terminate == "N") // Loop to find out no of binary positions
{
num1 = pow(2,y);
if (num%num1==num)
{
terminate = "Y";
break;
}
y = y +1;
}
int remctr = 0;
for (int i=0; i<y; i++) // Iterate for binary position times from 0
{
num1 = pow(2,i);
num2 = int(num/num1);
if (num2%2 == 1)
{
remctr = remctr + 1; // Accumulate binary counter
}
}
// infer the binary counter to get results
if ((remctr%2) == 0)
cout << "The given number " << num << " is evil ";
else
cout << " The given number " << num << " is Odious";
}
Output:
Conclusion
Methods of finding out whether a given number is an evil number or not were explained in this article with examples from Python and C++. This concept is used in number theory and data science to study the behaviour of numbers and applicate them in games and statistics scenarios.
Recommended Articles
We hope that this EDUCBA information on “Evil Number” was beneficial to you. You can view EDUCBA’s recommended articles for more information.