বাইনারি আকারে কীভাবে একটি নম্বর মুদ্রণ করবেন?


215

আমি অপারেটিং সিস্টেমগুলি সম্পর্কে একটি কলেজ কোর্স অনুসরণ করছি এবং আমরা বাইনারি থেকে হেক্সাডেসিমাল, দশমিক হেক্সাডেসিমেল ইত্যাদিতে রূপান্তর করতে শিখছি এবং আজ আমরা কেবল শিখলাম কিভাবে কীভাবে স্বাক্ষরিত / স্বাক্ষরযুক্ত সংখ্যাগুলি দুটিটির পরিপূরক (~ সংখ্যা ব্যবহার করে মেমরিতে সংরক্ষণ করা হয়) + 1)।

কাগজে করণে আমাদের বেশ কয়েকটি অনুশীলন রয়েছে এবং আমি আমার কাজটি শিক্ষকের কাছে জমা দেওয়ার আগে আমার উত্তরগুলি যাচাই করতে সক্ষম হতে চাই। আমি প্রথম কয়েকটি অনুশীলনের জন্য একটি সি ++ প্রোগ্রাম লিখেছিলাম তবে এখন আমি কীভাবে নিম্নলিখিত উত্তর দিয়ে আমার উত্তরটি যাচাই করতে পারি তা নিয়ে আটকা পড়েছি:

char a, b;

short c;
a = -58;
c = -315;

b = a >> 3;

এবং আমরা বাইনারি উপস্থাপনা দেখানোর প্রয়োজন মেমরি এর a, bএবং c

আমি এটি কাগজে করেছি এবং এটি আমাকে নিম্নলিখিত ফলাফলগুলি দেয় (দু'জনের পরিপূরকের পরে সংখ্যার স্মৃতিতে সমস্ত বাইনারি উপস্থাপনা):

a = 00111010 (এটি একটি চর, তাই 1 বাইট)

b = 00001000 (এটি একটি চর, তাই 1 বাইট)

সি = 11111110 11000101 (এটি একটি সংক্ষিপ্ত, তাই 2 বাইট)

আমার উত্তর যাচাই করার কোন উপায় আছে? কোনও সংখ্যার স্মৃতিতে বাইনারি উপস্থাপনা দেখানোর জন্য কি সি ++ তে কোনও স্ট্যান্ডার্ড উপায় আছে, বা আমাকে প্রতিটি পদক্ষেপটি নিজেরাই কোড করতে হবে (দুজনের পরিপূরক গণনা করুন এবং তারপরে বাইনারি রূপান্তর করুন)? আমি জানি যে পরবর্তীকালে এত বেশি সময় লাগবে না তবে এটি করার কোনও মানক উপায় আছে কিনা তা নিয়ে আমি আগ্রহী।


2
আপনি হেক্সাডেসিমাল উপস্থাপনা বোঝেন? আপনি যদি তা করেন, আপনি std::hexম্যানিপুলেটর ব্যবহার করে হেক্স উপস্থাপনাটি মুদ্রণ করতে পারেন - আমি আপনাকে এটিকে বাকি কাজ করার জন্য অনুশীলন হিসাবে ছেড়ে দেব ...
নিম

3
আপনি "স্মৃতিতে" প্রচুর পরিমাণে জোর দিন, তবে আমি আশা করি তারা আপনাকে এন্ডিয়ান সমস্যাগুলি মোকাবেলা করছে না।
মার্ক রান্সম

আপনি কি জানেন যে পরিণতি কি সম্পর্কে কোনও ধারণা আছে? আপনি যদি করেন, আপনি কি এই অনুশীলনের জন্য এটি যত্নশীল? এই প্রশ্নের উত্তর আপনার প্রশ্নের উত্তরকে প্রভাবিত করতে পারে।
আর মার্টিনহো ফার্নান্দেস

আপনার আইডিই এর উপর নির্ভর করে আপনি যদি কেবল নিজের হাতে লিখিত সমাধানটির যথার্থতা যাচাই করতে দেখেন এবং বাস্তবে দরকারী কিছু প্রদর্শন করার জন্য কোনও প্রোগ্রাম লিখছেন না, আপনি মেমরির সঠিক বিষয়বস্তু দেখতে ভিজুয়াল স্টুডিওর মেমরি দর্শকের মতো কিছু ব্যবহার করতে পারেন।
কিলি নারো

1
এমনকি গুগল এটি করে, উদাহরণস্বরূপ "বাইনারি -58" - তবে কোডটিতে কীভাবে এটি করা যায় তা অনুসন্ধান করার জন্য +1 করে।
কনরাড রুডল্ফ

উত্তর:


419

সবচেয়ে সহজ উপায় হ'ল সম্ভবত একটি std::bitsetপ্রতিনিধিত্বকারী মান তৈরি করা , তারপরে এটি স্ট্রিম করুন cout

#include <bitset>
...

char a = -58;    
std::bitset<8> x(a);
std::cout << x << '\n';

short c = -315;
std::bitset<16> y(c);
std::cout << y << '\n';

23
আহ, আমি ভুলে যাচ্ছি std::bitset! +1আমার থেকে.
এসবিআই

2
আমার অজ্ঞতাটি ক্ষমা করুন, তবে এটি কি কেবল কোনও সংখ্যার দ্বি-উপাত্ত উপস্থাপনা (উদাহরণস্বরূপ 8 হবে 00001000) বা এর স্মৃতি উপস্থাপনা (উদাহরণস্বরূপ কীভাবে সাইন বিটের যত্ন নিয়ে এবং "দু'জনের পরিপূরক" ব্যবহার করে সংরক্ষণ করা হবে)?
জেসি এমন্ড

12
@ জেসি: bitsetএর কনস্ট্রাক্টর আর্গুমেন্টটিকে স্বাক্ষরবিহীন মান হিসাবে ব্যাখ্যা করা হয়, যা দু'জনের পরিপূরক হিসাবে একই কাজ করে। কড়া কথায় বলতে গেলে সি ++ দু'জনের পরিপূরক গাণিতিকের গ্যারান্টি দেয় না -58 >> 3এবং আপনার উদাহরণে অপারেশনটিও অপরিজ্ঞাত।
পোটোটোওয়াটার

আমি কি বিটসেট মানটি (যেমন, উদাহরণস্বরূপ x বা y) একটি চরকে টাইপ করতে পারি?
নির্বানস্বাপ

1
ধন্যবাদ জেরি, আমি কয়েক মিনিট পরে_আমি আবিষ্কার করেছি। এফওয়াইআই, ingালাই কাজ করে না, বিটসেট ভেরিয়েবল হ'ল কিছু সত্যই আরকেন-চেহারার বিটসেট 3ুল (?!) শ্রেণীর অবজেক্ট। বিমূর্ততা কাজ করতে দেওয়া সেরা!
নির্বানস্বাপ

102

এতে ফ্লাইটে রূপান্তরটি ব্যবহার করুন std::bitset। কোনও অস্থায়ী ভেরিয়েবল, কোনও লুপ, কোনও কার্য, কোনও ম্যাক্রো নেই।

Live On Coliru

#include <iostream>
#include <bitset>

int main() {
    int a = -58, b = a>>3, c = -315;

    std::cout << "a = " << std::bitset<8>(a)  << std::endl;
    std::cout << "b = " << std::bitset<8>(b)  << std::endl;
    std::cout << "c = " << std::bitset<16>(c) << std::endl;
}

ছাপে:

a = 11000110
b = 11111000
c = 1111111011000101

6
মনে রাখবেন যে হার্ড-কোডিং আকারটি প্রয়োজনীয় নয়। যেমন মুদ্রণ করতে xব্যবহার করুন: std::cout << std::bitset<8*sizeof(x)>(x)
অ্যাপলিস মনিকা

25

আপনি যদি কেবল কোনও পূর্ণসংখ্যার হিসাবে নয়, কোনও বস্তুর বিট উপস্থাপনা প্রদর্শন করতে চান তবে প্রথমে চর অ্যারে হিসাবে পুনরায় ব্যাখ্যা করতে ভুলবেন না, তবে আপনি সেই অ্যারের সামগ্রীগুলি হেক্স হিসাবে বা বাইনারি (বিটসেটের মাধ্যমে) হিসাবে মুদ্রণ করতে পারেন:

#include <iostream>
#include <bitset>
#include <climits>

template<typename T>
void show_binrep(const T& a)
{
    const char* beg = reinterpret_cast<const char*>(&a);
    const char* end = beg + sizeof(a);
    while(beg != end)
        std::cout << std::bitset<CHAR_BIT>(*beg++) << ' ';
    std::cout << '\n';
}
int main()
{
    char a, b;
    short c;
    a = -58;
    c = -315;
    b = a >> 3;
    show_binrep(a);
    show_binrep(b);
    show_binrep(c);
    float f = 3.14;
    show_binrep(f);
}

নোট সবচেয়ে সাধারণ সিস্টেম, অল্প endian হয় যাতে আউটপুট show_binrep(c)হয় না , 1111111 011000101 আশা কারণ যে না এটা কিভাবে স্মৃতিতে সঞ্চিত আছে। আপনি যদি বাইনারিতে মূল্য উপস্থাপনের সন্ধান করেন তবে একটি সাধারণ cout << bitset<16>(c)কাজ।


11

কোনও সংখ্যার স্মৃতিতে বাইনারি উপস্থাপনা দেখানোর জন্য কি সি ++ তে কোনও স্ট্যান্ডার্ড উপায় আছে [...]?

নং std::bin, মতো std::hexবা নেই std::dec, তবে কোনও সংখ্যা বাইনারি নিজেই আউটপুট করা শক্ত নয়:

আপনি বাম-শিফটকে অন্য সমস্তকে মাস্কিং করে বাম-সর্বাধিক বিট আউটপুট দেন এবং আপনার কাছে থাকা সমস্ত বিটের জন্য এটি পুনরাবৃত্তি করে।

(এক ধরণের বিটের সংখ্যা হ'ল sizeof(T) * CHAR_BIT)


7

ইতিমধ্যে যা পোস্ট করা হয়েছে তার অনুরূপ, বিট পাওয়ার জন্য কেবল বিট-শিফট এবং মাস্ক ব্যবহার করুন; যে কোনও প্রকারের জন্য ব্যবহারযোগ্য, একটি টেম্পলেট হিসাবে ( 1 বাইটে বিট সংখ্যা পাওয়ার কোনও স্ট্যান্ডার্ড উপায় আছে কিনা তা নিশ্চিত নয়, আমি এখানে 8 ব্যবহার করেছি )।

#include<iostream>
#include <climits>

template<typename T>
void printBin(const T& t){
    size_t nBytes=sizeof(T);
    char* rawPtr((char*)(&t));
    for(size_t byte=0; byte<nBytes; byte++){
        for(size_t bit=0; bit<CHAR_BIT; bit++){
            std::cout<<(((rawPtr[byte])>>bit)&1);
        }
    }
    std::cout<<std::endl;
};

int main(void){
    for(int i=0; i<50; i++){
        std::cout<<i<<": ";
        printBin(i);
    }
}

3
বাইট প্রতি বিটের সংখ্যা পাওয়ার মানক উপায় হ'ল ম্যাক্রো CHAR_BIT
আর মার্টিনহো ফার্নান্দেস

এটি প্রদর্শিত হয় যে এসবিআই @ আর.মার্টিনহো ফার্নান্দেসের মন্তব্য অনুসারে of এর পোস্ট সম্পাদনা করেছে। তবে, তিনি সর্বশেষ বাক্যটি পরিবর্তন করেন নি। আমি সম্পাদনা করব।
gsamaras

3

পুনরায় ব্যবহারযোগ্য ফাংশন:

template<typename T>
static std::string toBinaryString(const T& x)
{
    std::stringstream ss;
    ss << std::bitset<sizeof(T) * 8>(x);
    return ss.str();
}

ব্যবহার:

int main(){
  uint16_t x=8;
  std::cout << toBinaryString(x);
}

এটি সব ধরণের পূর্ণসংখ্যার সাথে কাজ করে।


1
#include <iostream> 
#include <cmath>       // in order to use pow() function
using namespace std; 

string show_binary(unsigned int u, int num_of_bits);

int main() 
{ 

  cout << show_binary(128, 8) << endl;   // should print 10000000
  cout << show_binary(128, 5) << endl;   // should print 00000
  cout << show_binary(128, 10) << endl;  // should print 0010000000

  return 0; 
}

string show_binary(unsigned int u, int num_of_bits) 
{ 
  string a = "";

  int t = pow(2, num_of_bits);   // t is the max number that can be represented

  for(t; t>0; t = t/2)           // t iterates through powers of 2
      if(u >= t){                // check if u can be represented by current value of t
          u -= t;
          a += "1";               // if so, add a 1
      }
      else {
          a += "0";               // if not, add a 0
      }

  return a ;                     // returns string
}

এটা করা উচিত int t = pow(2, num_of_bits - 1);?
BmyGuest

0

পুরানো সি ++ সংস্করণ ব্যবহার করে আপনি এই স্নিপেট ব্যবহার করতে পারেন:

template<typename T>
string toBinary(const T& t)
{
  string s = "";
  int n = sizeof(T)*8;
  for(int i=n-1; i>=0; i--)
  {
    s += (t & (1 << i))?"1":"0";
  }
  return s;
}

int main()
{
  char a, b;

  short c;
  a = -58;
  c = -315;

  b = a >> 3;

  cout << "a = " << a << " => " << toBinary(a) << endl;
  cout << "b = " << b << " => " << toBinary(b) << endl;
  cout << "c = " << c << " => " << toBinary(c) << endl;
}

a = => 11000110
b = => 11111000
c = -315 => 1111111011000101

বিটের ভুল সংখ্যা মুদ্রণ করা হচ্ছে। 111 000 110 9 বিট, 8 নয় not
ডেভিড লেজার

আমি সীমানা ভুল করেছি, দয়া করে এখনই পরীক্ষা করুন
রতাহ

0

Std :: বিটসেট উত্তর এবং সুবিধার টেম্পলেট ব্যবহার:

#include <iostream>
#include <bitset>
#include <climits>

template<typename T>
struct BinaryForm {
    BinaryForm(const T& v) : _bs(v) {}
    const std::bitset<sizeof(T)*CHAR_BIT> _bs;
};

template<typename T>
inline std::ostream& operator<<(std::ostream& os, const BinaryForm<T> bf) {
    return os << bf._bs;
}

এটি এটির মতো ব্যবহার করে:

auto c = 'A';
std::cout << "c: " << c << " binary: " << BinaryForm{c} << std::endl;
unsigned x = 1234;
std::cout << "x: " << x << " binary: " << BinaryForm{x} << std::endl;
int64_t z { -1024 };
std::cout << "z: " <<  << " binary: " << BinaryForm{z} << std::endl;

আউটপুট উত্পন্ন:

c: A binary: 01000001
x: 1234 binary: 00000000000000000000010011010010
z: -1024 binary: 1111111111111111111111111111111111111111111111111111110000000000

-5

এখানে কোনও সংখ্যার বাইনারি উপস্থাপনা পাওয়ার আসল উপায় রয়েছে:

unsigned int i = *(unsigned int*) &x;

না; এটি শুধু এক্স অনুলিপি i। আপনি যদি এটাকে রসিকতা বলতে না চান?
অ্যান্থনিডি 973

-11

এটি কি আপনি খুঁজছেন?

std::cout << std::hex << val << std::endl;

30
মডারেটর নোট আমি এই উত্তরটির অধীনে বাছাই করে বিরোধী বা অন্যথায় গঠনমূলক মন্তব্যগুলি মুছে ফেলার চেষ্টা করেছি এবং খুব ভাঙা কথোপকথনটি শেষ করেছি। সমস্ত মন্তব্য মুছে ফেলা হয়েছে। দয়া করে মন্তব্যগুলি পেশাদার, গঠনমূলক এবং সর্বোপরি বিষয়গুলিতে রাখুন। ওপি যদি এটিকে সরাতে চায় তবে ওপি এখনই এটিকে সরিয়ে ফেলত। আপনি যদি এই উত্তরটির সাথে একমত না হন তবে ভোট দিন। আপনি যদি এই উত্তরটি উন্নত করতে পারেন তবে সম্পাদনা করুন। </argument>। সত্যিই, আমরা বড়রা, হ্যাঁ? আমি প্রায় নিশ্চিত সবাই 13. ছিল করতে সব যে এখানে মন্তব্য উপর বয়সের চেক করা
টিম পোস্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.