নিচের 10 কে বিটওয়াইজ নট অপারেটর ব্যবহার করে signed int এর জন্যে -11 এবং unsigned int এর জন্যে 4294967285 হচ্ছে কিভাবে?

00000000000000000000000000001010 ⇒ 10 (32 bits) -------------------------------- ~ 11111111111111111111111111110101 ⇒ -11 (for signed) and -> 4294967285 (for unsigned)

asked 19 Feb '16, 13:15

sshuvo's gravatar image

sshuvo
15412


unsigned int:

unsigned int এর ক্ষেত্রেতো কোন সমস্যা নাই। নিচের স্বাভাবিক সূত্র অনুযায়ী আসে।

n-bit number হলেঃ

alt text

signed int:

signed int এর ক্ষেত্রেও কোন সমস্যা নাই। নিচের সূত্র অনুযায়ী হবে।

n-bit number হলেঃ

alt text


উপরের ২টা সূত্র দিয়ে হিসাব করলেই কাজ হয়ে যায়, নিচের কথাগুলো অতিরিক্ত জ্ঞান।

signed representation:

signed int এর ক্ষেত্রে নেগেটিভ নাম্বারগুলোকে 2's complement করে রাখা হয়। এটা খুব সহজ। ধরুন একটা সংখ্যা ১০, তার বাইনারি 001010. আমরা ছোট করার জন্য 6-bit নিলাম, কম্পিউটারে 32-bit. কিন্তু, কথা হলো -১০ এর রিপ্রেজেন্টেশন কি হবে?

১. প্রথমে একে বিটওয়াইজ নট করতে হবে, যাকে 1's complement বলে।

001010 --> 110101

২. এরপর এর সাথে 1 যোগ করতে হবে, যাকে 2's complement বলে।

110101
+    1
------
110110

অর্থাৎ 6-bit এর ক্ষেত্রে -১০ এর রিপ্রেজেন্টেশন 110110.

মজার ব্যাপার হলো, এই -১০ থেকে যদি আবার ১০ পেতে চাই, তাহলে একে 2's complement করলেও কাজ করবে।

এটা আর হিসাব করে দেখালাম না, নিচের কোডটা রান করলেই দেখতে পাবেন।

Code:

#include <bits/stdc++.h>
#define _ ios_base::sync_with_stdio(0);cin.tie(0);

using namespace std;

int main()
{
    int n = 10;
    unsigned m = 10;
//    clock_t begin, end;
//    double time_spent;
//    begin = clock();

    bitset<32> now(n);
    cout<<"n        = "<<now.to_string()<<" = "<<n<<endl;
    bitset<32> now0(~n);
    cout<<"~n       = "<<now0.to_string()<<" = "<<~n<<endl;
    bitset<32> now1(-n);
    cout<<"-n       = "<<now1.to_string()<<" = "<<-n<<endl;
    bitset<32> now2(~(-n)+1);
    cout<<"~(-n)+1  = "<<now2.to_string()<<" = "<<~(-n)+1<<endl;

    bitset<32> now3(m);
    cout<<"m        = "<<now3.to_string()<<" = "<<m<<endl;
    bitset<32> now4(~m);
    cout<<"~m       = "<<now4.to_string()<<" = "<<~m<<endl;

//    end = clock();
//    time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
//    cerr<<"Time spent = "<<time_spent<<endl;

   return 0;
}

Output:

n        = 00000000000000000000000000001010 = 10
~n       = 11111111111111111111111111110101 = -11
-n       = 11111111111111111111111111110110 = -10
~(-n)+1  = 00000000000000000000000000001010 = 10
m        = 00000000000000000000000000001010 = 10
~m       = 11111111111111111111111111110101 = 4294967285

কোন জিজ্ঞাসা থাকলে কমেন্ট করতে ভুলবেন না।

ধন্যবাদ।

permanent link

answered 19 Feb '16, 18:18

manetsus's gravatar image

manetsus
2.2k211

edited 19 Feb '16, 18:21

1

ভাইয়া,কোড টা বুঝতেছিনা।আসোলে,আমি C++ এর STL পার্ট টা এখনও পড়ি নাই।আর টাইম রিলেটেড অনেক কিছুই এখনও পড়ি নাই। পড়বো খুব শীগ্রই।আপনি যদি কোডিং এ কি করেছেন,সেটা একটু কষ্ট করে লিখে দিতেন,তবে বেশ উপকার হতো। তবে,ভাইয়া আপনার এই কষ্টের জন্যে আপনাকে অনেক অনেক ধন্যবাদ। ভাইয়া, আমি একটা জিনিস খেয়াল করেছি,সেটা হলো যদি a=10 দেই ,পরে এটাকে নট করলে int এর জন্যে -11 আসে। যে সংখ্যাটার নট করতেছি, সেটার পরের সংখ্যা টার নেগেটিভ ফর্ম পাচ্ছি।

(19 Feb '16, 18:28) sshuvo
1

@sshuvo বিটসেট দিয়ে শুধু এতটুকুই করেছি যে সংখ্যাটাকে বাইনারিতে নিয়ে প্রিন্ট করে। আর টাইমের কিছুই করিনি, ওটা আমার প্রিকোডের অংশ, কমেন্ট করা আছে। আর বেশি কষ্ট হলে কোড বুঝার দরকার নেই, আউটপুটটা বুঝলেই হবে। ধন্যবাদ।

(19 Feb '16, 18:34) manetsus
1

থ্যাঙ্কস,ভাইয়া।

(19 Feb '16, 18:36) sshuvo
1

@sshuvo হ্যাঁ, আপনি ঠিক ধরেছেন, পরের সংখ্যাটার নেগেটিভ পান বলেই আমরা 2's complement করার সময় 1 যোগ করে এটাকে যায়গায় নিয়ে আসি। আপনাকেও অনেক ধন্যবাদ। :)

(19 Feb '16, 18:40) manetsus
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:

×14
×7
×1

question asked: 19 Feb '16, 13:15

question was seen: 736 times

last updated: 19 Feb '16, 18:45