সি # বাইনারি আক্ষরিক


186

C # তে বাইনারি আক্ষরিক লিখার মতো কোনও উপায় আছে, 0x সহ হেক্সাডেসিমাল উপসর্গ করার মতো? 0 বি কাজ করে না।

যদি তা না হয় তবে এটি করার সহজ উপায় কী? কিছু ধরণের স্ট্রিং রূপান্তর?


2
ধ্রুবকগুলি ব্যবহার করুন এবং তাদের যথাযথ নাম দিন, তারপরে আপনাকে এটিকে দশমিক দশে লিখতে হবে তা সত্য নয়। ব্যক্তিগতভাবে আমি তার if (a == MaskForModemIOEnabled)চেয়ে পড়তে চাইif (a == 0b100101)
লাসে ভি কার্লসেন

1
: আরেকটি নোট: আপনি কি এই পোস্টটি যদি খুঁজে পাওয়া যায় কারণ আপনি একটি বিট ক্ষেত্র চাই, ফ্ল্যাগ-অ্যাট্রিবিউট বিবেচনা করুন msdn.microsoft.com/en-us/library/cc138362.aspx#sectionToggle0
toxvaerd

16
উভয় খুব ভাল পরামর্শ, বিটফিল্ড সংজ্ঞায়িত করা ব্যতীত , যেখানে এই নামক ধ্রুবক সংজ্ঞাগুলি বাইনারি আক্ষরিক সাথে পড়া এবং লিখতে সহজ হতে পারে। [পতাকাগুলি] এনাম পরিমাণ {কিছুই নয় = 0, এক = 1, কিছু = 0 বি 10, সর্বাধিক = 0 বি 100, সমস্ত = 0 বি 111}
বায়ানারি

1
এটি মূল্যবান কিসের জন্য, রজলিনের জন্য বাইনারি আক্ষরিক জন্য সমর্থন পরিকল্পনা করা হয়েছে
জো হোয়াইট

এটি এখনও সি # 6.0 তে সমর্থিত নয়, তাই না? Vs2015: /
anhoppe

উত্তর:


145

সি # 7.0 সমর্থন বাইনারি লিটারেল (এবং আন্ডারস্কোর অক্ষর মাধ্যমে ঐচ্ছিক অঙ্ক বিভাজক)।

একটি উদাহরণ:

int myValue = 0b0010_0110_0000_0011;

আপনি রোজলিন গিটহাব পৃষ্ঠায় আরও তথ্য পেতে পারেন ।


3
@ ডি সিংহ আমি এখন এটি সি # 7 তালিকায় দেখতে পাচ্ছি। github.com/dotnet/roslyn/issues/2136
ড্যানেশন

9
খুব সুন্দর! ভিএস2017 / সি # 7 এ দুর্দান্ত কাজ করছে।
এসটিএলডিভ

1
এটি মনে রাখতে সাহায্য করে যে সি # র বাইনারি লিটারালগুলি বড়-এন্ডিয়ান, তবে x86 সংখ্যায় কম-এন্ডিয়ান হয়, তাই Int16 = 0b0010_0110_0000_0011এটি { 0b0000_0011, 0b0010_0110 }বিভ্রান্তিকর হিসাবে সংরক্ষণ করা হবে ।
দাই

1
@ ডাই এটি হেক্স আক্ষরিক চেয়ে আলাদা নয়। অন্য কথায়, সমস্ত ধ্রুবকগুলি বড় এন্ডিয়ান, তবে ইন্টেল / এএমডি এবং বেশিরভাগ এআরএমগুলিতে সামান্য এন্ডিয়ান সংরক্ষণ করে। 0xDEADBEEFহিসাবে সংরক্ষণ করা হবে0xEF 0xBE 0xAD 0xDE
কোল জনসন

168

হালনাগাদ

সি # 7.0 এ এখন বাইনারি আক্ষরিক রয়েছে যা দুর্দান্ত।

[Flags]
enum Days
{
    None = 0,
    Sunday    = 0b0000001,
    Monday    = 0b0000010,   // 2
    Tuesday   = 0b0000100,   // 4
    Wednesday = 0b0001000,   // 8
    Thursday  = 0b0010000,   // 16
    Friday    = 0b0100000,   // etc.
    Saturday  = 0b1000000,
    Weekend = Saturday | Sunday,
    Weekdays = Monday | Tuesday | Wednesday | Thursday | Friday
}

আসল পোস্ট

যেহেতু বিষয়টি এনামগুলিতে বিট-ভিত্তিক পতাকা মানগুলি ঘোষণার দিকে পরিণত হয়েছে বলে মনে হয়, তাই আমি ভেবেছিলাম যে এই ধরণের জিনিসটির জন্য একটি সহজ কৌশল দেখানো ভাল। বাম-শিফট অপারেটর ( <<) আপনাকে নির্দিষ্ট বাইনারি অবস্থানে কিছুটা চাপ দেওয়ার অনুমতি দেবে। একই শ্রেণীর অন্যান্য মানগুলির শর্তে এনাম মানগুলি ঘোষণার ক্ষমতার সাথে একত্রিত করুন এবং বিট ফ্ল্যাগ এনামগুলির জন্য আপনার কাছে খুব সহজেই পঠনযোগ্য পড়ার ঘোষণামূলক সিনট্যাক্স রয়েছে।

[Flags]
enum Days
{
    None        = 0,
    Sunday      = 1,
    Monday      = 1 << 1,   // 2
    Tuesday     = 1 << 2,   // 4
    Wednesday   = 1 << 3,   // 8
    Thursday    = 1 << 4,   // 16
    Friday      = 1 << 5,   // etc.
    Saturday    = 1 << 6,
    Weekend     = Saturday | Sunday,
    Weekdays    = Monday | Tuesday | Wednesday | Thursday | Friday
}

26
@ কোল জনসন: অনেক বিকাশকারী এটিকে পছন্দ করেন। আমি কিছু বিকাশকারী হিসাবে আমার মাথার হেক্স রূপান্তর করতে ততটা ভাল নই, এবং কখনও কখনও সর্বনিম্ন সাধারণ ডিনোমিনেটরকে মেটানো ভাল।
স্ট্রিপলিং ওয়ারিয়র

2
আমি মনে করি এটিগুলি সবচেয়ে কার্যকর উপায় যেহেতু এনামগুলি ধ্রুবক হিসাবে নির্মিত। [চ্ছিক [পতাকা] বৈশিষ্ট্যের সাহায্যে এগুলি বিটওয়াইজ অপারেশনে ব্যবহার করা যেতে পারে (সরাসরি প্রশ্নের সাথে সম্পর্কিত নয়, তবে বাইনারি আক্ষরিক বিবরণ দেওয়ার ক্ষেত্রে বিশেষত কার্যকর)। আরেকটি আকর্ষণীয় সম্ভাবনা হ'ল এনাম টাইপটি একটি বিল্ট-ইন টাইপ হিসাবে জোর করা (উদাহরণস্বরূপ, 'দিনগুলির পরে': বাইট যোগ করুন); বিট.ইল
এম কেভি

এটি পড়তে আসলে খুব সহজ, যদিও
এনুমে

5
@ মাইকটি: আপনি কি এই শেষ চিন্তায় বিশদভাবে বলতে পারবেন (বা একটি লিঙ্ক সরবরাহ করতে পারেন)? আমি প্রায়শই "1" দিয়ে শুরু হওয়া এনামগুলি ঘোষণা করি কারণ যখন কোনও মান কখনই আরম্ভ করা হয় নি তখন আমি সনাক্ত করতে এবং ব্যর্থ-দ্রুত করতে সক্ষম হতে চাই । তবে কিছু পরিস্থিতি রয়েছে যেখানে একটি ডিফল্ট মান আসলে বোঝায় এবং আমি মনে করি যে সেই মানটির জন্য কোনও নাম যুক্ত করে কোনও ভুল হবে না।
স্ট্রিপলিং ওয়ারিয়র

3
@ মাইকিটি সিএইচ 1008 থেকে : "ফ্ল্যাগস্যাট্রিবিউট প্রয়োগ করা একটি গণনা যদি শূন্য-মূল্যবান সদস্যকে সংজ্ঞায়িত করে, তবে তার নামটি 'কোনওটিই' হওয়া উচিত তা বোঝাতে যে কোনও মান গণনায় সেট করা হয়নি।" সুতরাং এটি ডিফল্ট মান হিসাবে পরিবেশন করতে এটি যুক্ত করা পুরোপুরি বৈধ, যদি এটি "কিছুই না" বলা হয়। সামগ্রিকভাবে এটি কেবল আমার কাছে পরিষ্কার মনে হয় যদি কোনও ডিফল্ট-আরম্ভকৃত ক্ষেত্রের মানটি দেখানোর একটি নাম থাকে।
নায়ারগডস

115

কেবলমাত্র পূর্ণসংখ্যা এবং হেক্স সরাসরি, আমি ভীত (ECMA 334v4):

9.4.4.2 পূর্ণসংখ্যার লিটারালগুলি পূর্ণসংখ্যার লিটারালগুলি int, uint, দীর্ঘ এবং উলং প্রকারের মান লিখতে ব্যবহৃত হয়। পূর্ণসংখ্যার আক্ষরিকের দুটি সম্ভাব্য ফর্ম রয়েছে: দশমিক এবং হেক্সাডেসিমাল।

পার্স করতে, আপনি ব্যবহার করতে পারেন:

int i = Convert.ToInt32("01101101", 2);

4
এই উত্তরের আপডেট হিসাবে সর্বশেষতম আধুনিক তথ্য (জুলাই, ২০১৪) সহ; সি # 6.0 বাইনারি আক্ষরিক পরিচয় করিয়ে দেয়। আমার আপডেট হওয়া উত্তরটি নীচে নীচে দেখুন ...
BTownTKD

1
@ বিটাউনটিকেডি আপনার উত্তরটি আসলে শীর্ষে রয়েছে :) কারণ এটি গৃহীত উত্তর।
আরবিটি

25

এনামগুলিতে বিট পতাকা সম্পর্কিত @ স্ট্রিপলিং ওয়ারিয়রের উত্তরে যোগ করা, বিট শিফটগুলির মাধ্যমে উপরের দিকে গণনা করার জন্য আপনি হেক্সাডেসিমালে ব্যবহার করতে পারেন এমন একটি সহজ কনভেনশন রয়েছে। অনুক্রমটি 1-2-2-8 ব্যবহার করুন, একটি কলাম বাম দিকে সরান এবং পুনরাবৃত্তি করুন।

[Flags]
enum Scenery
{
  Trees   = 0x001, // 000000000001
  Grass   = 0x002, // 000000000010
  Flowers = 0x004, // 000000000100
  Cactus  = 0x008, // 000000001000
  Birds   = 0x010, // 000000010000
  Bushes  = 0x020, // 000000100000
  Shrubs  = 0x040, // 000001000000
  Trails  = 0x080, // 000010000000
  Ferns   = 0x100, // 000100000000
  Rocks   = 0x200, // 001000000000
  Animals = 0x400, // 010000000000
  Moss    = 0x800, // 100000000000
}

ডান কলাম দিয়ে শুরু করে স্ক্যান করুন এবং 1-2-0-8 (শিফট) 1-2-4-8 (শিফট) প্যাটার্নটি লক্ষ্য করুন ...


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

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


23

আপনি সর্বদা অর্ধ-আক্ষরিক, ধ্রুবক তৈরি করতে পারেন যা আপনার পরে মূল্য রয়েছে:

const int b001 = 1;
const int b010 = 2;
const int b011 = 3;
// etc ...
Debug.Assert((b001 | b010) == b011);

আপনি যদি এগুলি প্রায়শই ব্যবহার করেন তবে আপনি পুনরায় ব্যবহারের জন্য এগুলি একটি স্ট্যাটিক শ্রেণিতে আবদ্ধ করতে পারেন।

তবে, সামান্য বিষয় অফ-টপিক, যদি আপনার কাছে বিটগুলির সাথে কোনও শব্দার্থবিজ্ঞান যুক্ত থাকে (সংকলন সময়ে জানা) আমি তার পরিবর্তে একটি এনাম ব্যবহার করার পরামর্শ দেব:

enum Flags
{ 
    First = 0,
    Second = 1,
    Third = 2,
    SecondAndThird = 3
}
// later ...
Debug.Assert((Flags.Second | Flags.Third) == Flags.SecondAndThird);

18

আপনি যদি নেট সংকলক প্ল্যাটফর্মের ভাষা বৈশিষ্ট্য প্রয়োগের স্থিতিটি ("রোজলিন") দেখেন তবে আপনি পরিষ্কার দেখতে পাচ্ছেন যে সি # 6.0 এ এটি একটি পরিকল্পিত বৈশিষ্ট্য, সুতরাং পরবর্তী প্রকাশে আমরা এটি স্বাভাবিক উপায়ে করতে পারি।

বাইনারি আক্ষরিক অবস্থা


3
এটা কি ঘটেছে? ব্লগ করা সমস্ত বৈশিষ্ট্যগুলি আসলে ভিজ্যুয়াল স্টুডিও 2015 রিলিজ করে না।
কর্নেল আতঙ্ক

4
@ কলোনেলপ্যানিক - ন্যানেশন উল্লেখ করেছে যে এটি "এখন সি # 7 তালিকায়" - github.com/dotnet/roslyn/issues/2136
ওয়াই হা লি

3
string sTable="static class BinaryTable\r\n{";
string stemp = "";
for (int i = 0; i < 256; i++)
{
stemp = System.Convert.ToString(i, 2);
while(stemp.Length<8) stemp = "0" + stemp;
sTable += "\tconst char nb" + stemp + "=" + i.ToString() + ";\r\n";
}
sTable += "}";
Clipboard.Clear();
Clipboard.SetText ( sTable);
MessageBox.Show(sTable);

এটি ব্যবহার করে, 8 বিট বাইনারিগুলির জন্য, আমি এটি একটি স্ট্যাটিক ক্লাস তৈরি করতে ব্যবহার করি এবং এটি ক্লিপবোর্ডে রাখে .. তারপরে এটি প্রকল্পে আটকানো হয় এবং ব্যবহার বিভাগে যুক্ত হয়, সুতরাং nb001010 সহ যে কোনও কিছুই টেবিলের বাইরে নিয়ে যায়, সর্বনিম্ন স্থিতিশীল, তবে এখনও ... আমি প্রচুর পিক গ্রাফিক্স কোডিংয়ের জন্য সি # ব্যবহার করি এবং হাই-টেক সিতে 0 বি 101010 প্রচুর ব্যবহার করি

- কোড আউটপুট থেকে নমুনা -

static class BinaryTable
{   const char nb00000000=0;
    const char nb00000001=1;
    const char nb00000010=2;
    const char nb00000011=3;
    const char nb00000100=4;
//etc, etc, etc, etc, etc, etc, etc, 
}

:-) নিল


3

বাইনারি আক্ষরিক বৈশিষ্ট্যটি সি # 6.0 এবং ভিজ্যুয়াল স্টুডিও 2015 তে প্রয়োগ করা হয়নি but তবে 30 মার্চ ২০১ 2016 মাইক্রোসফ্ট ভিজ্যুয়াল স্টুডিও '15 'এর পূর্বরূপের নতুন সংস্করণটি ঘোষণা করেছিল যা আমরা বাইনারি আক্ষরিক ব্যবহার করতে পারি।

আমরা ডিজিটাল বিভাজকের জন্য এক বা একাধিক অ্যান্ডস্কোর (_) অক্ষর ব্যবহার করতে পারি। সুতরাং কোড স্নিপেট কিছু দেখতে হবে:

int x           = 0b10___10_0__________________00; //binary value of 80
int SeventyFive = 0B100_________1011; //binary value of 75

WriteLine($" {x} \n {SeventyFive}");

এবং আমরা উপরের কোড স্নিপেটে যেমন দেখানো হয়েছে তেমন 0 বি এবং 0 বি ব্যবহার করতে পারি।

আপনি যদি ডিজিটাল বিভাজকটি ব্যবহার করতে না চান তবে আপনি নীচের কোড স্নিপেটের মতো অঙ্ক বিভাজক ছাড়াই এটি ব্যবহার করতে পারেন

int x           = 0b1010000; //binary value of 80
int SeventyFive = 0B1001011; //binary value of 75

WriteLine($" {x} \n {SeventyFive}");

2

লিটারাল ব্যবহার সম্ভব না হলেও, সম্ভবত একটি বিটকনভার্টারও সমাধান হতে পারে?


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

1
ওচ, এখন আমি মনে করি কেন আমি সর্বদা সচেতন ছিলাম কিন্তু কখনই বিটকনভার্টারটি ব্যবহার করি নি ...
মাইকেল স্টাম

4
বিটকনভার্টারের ক্ষেত্র রয়েছে BitConverter.IsLittleEndian, যা আপনি হোস্ট মেশিনটি সামান্য এন্ডিয়ান না হলে পরীক্ষা করতে (এবং একটি বাফারকে বিপরীত করতে) ব্যবহার করতে পারেন।
শেয়াল 21

1

স্ট্রিং পার্সিং সলিউশনটি সর্বাধিক জনপ্রিয় হলেও আমি এটি পছন্দ করি না, কারণ পার্সিং স্ট্রিং কিছু পরিস্থিতিতে দুর্দান্ত পারফরম্যান্স হিট হতে পারে।

যখন কোনও ধরণের বিটফিল্ড বা বাইনারি মাস্কের প্রয়োজন হয়, আমি বরং এটি লিখতে চাই

দীর্ঘ বিটমাস্ক = 1011001;

এবং পরে

int বিট 5 = বিটফিল্ড.গেটবিট (বিটমাস্ক, 5);

অথবা

বুল পতাকা 5 = বিটফিল্ড.গেটফ্ল্যাগ (বিটমাস্ক, 5); ``

যেখানে বিটফিল্ড ক্লাস

public static class BitField
{
    public static int GetBit(int bitField, int index)
    {
        return (bitField / (int)Math.Pow(10, index)) % 10;
    }

    public static bool GetFlag(int bitField, int index)
    {
        return GetBit(bitField, index) == 1;
    }
}

4
ইশ। শুধু এনাম ব্যবহার করবেন না কেন? ১-০-০-২০১৮ অর্থ অন্ট হাজার ব্যবহার করা কেবল সমস্যা চাইছে।
ক্লিমেট

1

আপনি 0b000001ভিজ্যুয়াল স্টুডিও 2017 (সি # 7.0) থেকে ব্যবহার করতে পারবেন


0

মূলত, আমি মনে করি উত্তরটি কোনও, কোনও সহজ উপায় নেই। দশমিক বা হেক্সাডেসিমাল ধ্রুবক ব্যবহার করুন - এগুলি সহজ এবং স্পষ্ট। @ রয়টাইঙ্কার্স উত্তরটিও ভাল - একটি মন্তব্য ব্যবহার করুন।

int someHexFlag = 0x010; // 000000010000
int someDecFlag = 8;     // 000000001000

অন্যদের উত্তরগুলি এখানে বেশ কয়েকটি দরকারী কাজের-একটি রাউন্ড উপস্থাপন করে তবে আমি মনে করি যে তারা সহজ উত্তর পরে আর ভাল নয়। সি # ভাষা ডিজাইনার সম্ভবত একটি '0 বি' উপসর্গটিকে অপ্রয়োজনীয় বলে মনে করেছিলেন। এইচএক্স বাইনারি রূপান্তরিত করা সহজ, এবং বেশিরভাগ প্রোগ্রামাররা যাইহোক 0-8 এর ডিসি সমতুল্য জানতে হবে।

এছাড়াও, ডিবাগারে মানগুলি পরীক্ষা করার সময়, তাদের HEX বা DEC প্রদর্শিত হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.