C++ Evil Number Program

Beginner
6 min read
Updated: Oct 2026
2 programs
Live preview

What Is an Evil Number?

An evil number is a nonnegative integer whose binary form has an even number of 1 bits. That count is called the popcount (Hamming weight). An odd popcount means the number is odious.

Remember
n is evil  ↔  (count of 1-bits in binary n) is even

Examples:
  15 → 1111 → 4 ones → evil
   7 → 111  → 3 ones → odious
   0 → 0    → 0 ones → evil
   3 → 11   → 2 ones → evil
nBinaryOnesResult
000Evil
3112Evil
71113Odious
1511114Evil

How to Check an Evil Number in C++

Four clear steps — then pick a teaching loop or the built-in popcount.

  1. Require n >= 0 (this page rejects negatives).
  2. Count how many 1 bits appear in binary n.
  3. If that count is even, n is evil; otherwise it is odious.
  4. Use a divide-by-2 loop to learn the idea, or std::popcount (C++20) for production code.
MethodIdeaTimeBest for
Divide by 2Read bits with % 2 / / 2O(bits)Interviews, teaching binary
std::popcountBuilt-in popcount, then % 2O(1)Clear modern C++

Pseudocode

Pseudocode
function IsEvil(n):
    if n < 0:
        return false

    ones = 0
    while n > 0:
        if (n mod 2) == 1:
            ones = ones + 1
        n = n / 2

    return (ones mod 2) == 0

Cheat Sheet

Keep these facts handy while writing the program.

TopicDetail
GoalEven count of binary 1 bits
OppositeOdd popcount → odious
ZeroEvil (0 ones is even)
Fast checkstd::popcount((unsigned)n) % 2 == 0
Header<bit> (C++20)
Classic evil0, 3, 5, 6, 9, 10, 15
Classic odious1, 2, 4, 7, 8

Live Preview

Enter a nonnegative integer to see its binary form, popcount, and verdict.

Nonnegative whole numbers only. Tap a chip or type a value.

Result
n = 15
Binary = 1111
Ones = 4 (even)
Verdict: EVIL NUMBER

Worked Walkthrough — n = 15

Peel bits with % 2, count the ones, then check parity.

Calculation
15 in binary = 1111

Step 1: 15 % 2 = 1 → ones = 1; n = 7
Step 2:  7 % 2 = 1 → ones = 2; n = 3
Step 3:  3 % 2 = 1 → ones = 3; n = 1
Step 4:  1 % 2 = 1 → ones = 4; n = 0

ones = 4 → even → 15 is evil

C++ Programs

Start with the divide-by-2 loop so you can show each bit. Then use std::popcount when you want a short modern check.

Example 1 — Divide-by-2 Loop

Read each bit with % 2, count the ones, then test whether that count is even.

C++
#include <iostream>
using namespace std;

bool IsEvil(int n)
{
    if (n < 0)
    {
        return false;
    }

    int ones = 0;
    while (n > 0)
    {
        if (n % 2 == 1)
        {
            ones++;
        }
        n /= 2;
    }

    return ones % 2 == 0;
}

int main()
{
    int number = 15;
    if (IsEvil(number))
    {
        cout << number << " is an Evil Number." << endl;
    }
    else
    {
        cout << number << " is not an Evil Number." << endl;
    }
    return 0;
}

How It Works

  1. Reject negatives so the definition stays on nonnegative integers.
  2. n % 2 is the least significant bit; if it is 1, increment ones.
  3. n /= 2 shifts the remaining bits right (integer division).
  4. Repeat until n becomes 0.
  5. Return whether ones % 2 == 0. For 15, ones = 4 → evil.

Example 2 — std::popcount

Let the standard library count the 1-bits, then check parity in one expression.

C++
#include <bit>
#include <iostream>
using namespace std;

bool IsEvil(int n)
{
    if (n < 0)
    {
        return false;
    }
    return popcount(static_cast<unsigned>(n)) % 2 == 0;
}

int main()
{
    cout << (IsEvil(15) ? "15 is evil" : "15 is odious") << endl;
    cout << (IsEvil(7) ? "7 is evil" : "7 is odious") << endl;
    cout << (IsEvil(0) ? "0 is evil" : "0 is odious") << endl;
    return 0;
}

How It Works

  1. Include <bit> for std::popcount (C++20).
  2. Cast to unsigned so popcount matches the nonnegative definition.
  3. popcount returns the number of set bits.
  4. % 2 == 0 means that count is even → evil.
  5. Use the loop in interviews when you must show the process; use this in modern C++.

Edge Cases & Pitfalls

Check these before calling the solution done.

Zero

0 is evil

Zero ones is an even count. Do not treat 0 as a special false case.

Even vs evil

Different parity

n % 2 checks the value. Evil checks the popcount. Example: 2 is even but odious.

Negatives

Out of scope

Most definitions use nonnegative integers. Return false or reject the input.

Binary string

Count only ones

If you convert to a string, count '1' characters — not the string length.

Time and Space Complexity

ProgramTimeExtra space
Divide-by-2 loopO(bits)O(1)
std::popcountO(1)O(1)

For a 32-bit int, the loop runs at most 32 steps. Popcount is a fixed-width hardware-friendly operation.

Key Takeaways

  • Definition: even popcount → evil; odd popcount → odious.
  • Loop: peel bits with % 2 and / 2, then test ones % 2.
  • Built-in: std::popcount((unsigned)n) % 2 == 0.
  • Test set: 15 and 0 evil; 7 odious; 2 is even but still odious.

One line: count the 1-bits; if that count is even, the number is evil.

Frequently Asked Questions

A nonnegative integer is evil if its binary form has an even number of 1 bits (even popcount).
If the binary 1-bit count is odd, the number is odious — the opposite of evil.
Yes. Zero has zero 1-bits, and 0 is even.
15 in binary is 1111, which has four 1-bits. Four is even, so 15 is evil.
Even/odd looks at the value (n % 2). Evil/odious looks at the parity of the count of 1-bits.
Counting bits by dividing by 2 is O(number of bits). std::popcount is effectively O(1) for fixed-size integers.

Next: Factorial of a Number

Compute n! with an iterative loop (and watch overflow).

Factorial tutorial →

About the author

Mari Selvan M P
Mari Selvan M P 🔗

Developer, cloud engineer, and technical writer

  • Experience 12 years building web and cloud systems
  • Focus Full Stack Development, AWS, and Developer Education

I write practical tutorials so students and working developers can learn by doing—from databases and APIs to deployment on AWS.

9 people found this page helpful