কোড:

# include <stdio.h>

int main(void)
{
    int n;

    scanf("%d", &n);

    if(n&1)
        printf("hi\n");

    return 0;
}

এই প্রোগ্রাম এ n এর মান জোড় দিলে প্রিন্ট করে না।কিন্তু বিজোড় দিলে প্রিন্ট করে। if এর ভিতর শর্তটির মানে কি? অর্থাৎ n&1 condition এর মানে কি?

asked 26 May '16, 06:27

uchiha%20amit's gravatar image

uchiha amit
1206

edited 26 May '16, 10:14

Tamim%20Shahriar%20Subeen's gravatar image

Tamim Shahriar Subeen ♦♦
6.2k11128


কন্ডিশন অংশের & হচ্ছে Bitwise And অপারেটর। এইটা একটা Binary অপারেটর অর্থাৎ দুইটা অপারেন্ড নিয়া কাজ করে।

এইটা অপারেন্ড দুইটাকে বাইনারি ফর্মে নিয়ে কাজ করে। কাজ গুলা যে নিয়মে করে তা হলঃ

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

অর্থাৎ দুইটা বিট যদি 1 তাহলে 1 হবে, অন্যথায় 0।

আপনার কন্ডিশন অংশে n = একটা জোড় সংখ্যা ধরা যাক, n = 10. 10 এর বাইনার ফর্ম হচ্ছে 1010 এবং 1 এর বাইনারি ফর্ম হচ্ছে 1। তাহলে,

n & 1
10 & 1 //n এর মান বসালাম
00000000 00000000 00000000 00001010 & 00000000 00000000 00000000 00000001 //বাইনারি ফর্ম

লাস্ট লাইনটা যদি নিচের মত লিখি আপনার বুঝতে সুবিধা হবে,

00000000 00000000 00000000 00001010
00000000 00000000 00000000 00000001

এইবার শেষে থেকে (ডান - বাম) দেখেন n, মানে 10 এর শেষ বিট = 0 এবং 1 এর শেষ বিট 1. নিয়ম অনুযায়ী

0 & 1 = 0

একিভাবে n এর শেষের আগের বিট হচ্ছে, 1 আর 1 এর শেষের আগের বিট 0. নিয়ম অনুযায়ী

1 & 0 = 0

এভাবে সব হিসাব করে দেখেন শেষে সব গুলো বিট 0 হয়ে যাবে। অর্থাৎ

n & 1 = 0

আর আমরা জানি কন্ডিশন অংশে 0 পাইলেই শর্ত মিথ্যা হয়ে যায়। আর শর্ত মিথ্যা হইলে if সংশ্লিষ্ট স্টেটমেন্ট কাজ করে না।

এখানে আপনার প্রশ্ন ছিলো n = জোড় সংখ্যা হলে if সংশ্লিষ্ট স্টেটমেন্ট কাজ করে না। কাজ করে না এজন্য যে, 1 এর বাইনারি মান হচ্ছে,

00000000 00000000 00000000 00000001

আর সব জোড় সংখ্যার বাইনারি ফর্মে লাস্ট বিট সব সময় 0 হয় যার কারণে 0 & 1 = 0 হয় আর বাকি বিট গুলো হিসাব করে দেখলে ঐ নিয়মে পুরো কন্ডিশনের মান শূন্য হয়ে যায়।

কিন্তু n = যদি বিজোড় সংখ্যা হয় এবং তা বাইনারি ফর্মে আনা হয় তাহলে বিজোড় সংখ্যার শেষ বিট 1 হয়। যেমনঃ

ধরি n = 7
n  & 1
00000000 00000000 00000000 00000001 &   00000000 00000000 00000000 00000111

অর্থাৎ
00000000 00000000 00000000 00000001
00000000 00000000 00000000 00000111

এখানে দেখেন বিজোড় সংখ্যার শেষ বিট 1 এবং 1 এর ও শেষ বিট 1 আর নিয়ম অনুযায়ী

1 & 1 = 1.

এখানে বাকি বিট গুলো নিয়ম অনুযায়ী হিসাব করলে দেখবেন সব 0 হয় অর্থাৎ

n & 1 = হবে 00000000 00000000 00000000 00000001 = 1

শর্ত সত্য তাই if সংশ্লিষ্ট স্টেটমেন্ট কাজ করবে।

একি ভাবে সব বিজোড় সংখ্যার জন্য শর্ত সত্য হয় আর জোড় সংখ্যার জন্য শর্ত মিথ্যা হয়।

[আপনি যদি সি প্রোগ্রামিং এ নতুন হোন অথবা বাইনারি সংখ্যা পদ্ধতি সম্বন্ধে ধারণা না থাকে তাহলে কিছুই বুঝবেন না। না বুঝলে ভয় পাওয়ার কারণ নাই, এক সময় বুঝবেন। প্রশ্নের উওর টা অনেক বড় তাই গুছায় লিখতে পারলাম না।]

permanent link

answered 26 May '16, 08:46

_Shaon_'s gravatar image

_Shaon_
796218

edited 29 May '16, 02:22

Your answer
toggle preview

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *italic* or _italic_
  • **bold** or __bold__
  • link:[text](http://url.com/ "title")
  • image?![alt text](/path/img.jpg "title")
  • numbered list: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported

Question tags:

×6
×5

question asked: 26 May '16, 06:27

question was seen: 715 times

last updated: 29 May '16, 02:22