C # তে বাইনারি আক্ষরিক লিখার মতো কোনও উপায় আছে, 0x সহ হেক্সাডেসিমাল উপসর্গ করার মতো? 0 বি কাজ করে না।
যদি তা না হয় তবে এটি করার সহজ উপায় কী? কিছু ধরণের স্ট্রিং রূপান্তর?
C # তে বাইনারি আক্ষরিক লিখার মতো কোনও উপায় আছে, 0x সহ হেক্সাডেসিমাল উপসর্গ করার মতো? 0 বি কাজ করে না।
যদি তা না হয় তবে এটি করার সহজ উপায় কী? কিছু ধরণের স্ট্রিং রূপান্তর?
উত্তর:
সি # 7.0 সমর্থন বাইনারি লিটারেল (এবং আন্ডারস্কোর অক্ষর মাধ্যমে ঐচ্ছিক অঙ্ক বিভাজক)।
একটি উদাহরণ:
int myValue = 0b0010_0110_0000_0011;
আপনি রোজলিন গিটহাব পৃষ্ঠায় আরও তথ্য পেতে পারেন ।
Int16 = 0b0010_0110_0000_0011
এটি { 0b0000_0011, 0b0010_0110 }
বিভ্রান্তিকর হিসাবে সংরক্ষণ করা হবে ।
0xDEADBEEF
হিসাবে সংরক্ষণ করা হবে0xEF 0xBE 0xAD 0xDE
সি # 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
}
কেবলমাত্র পূর্ণসংখ্যা এবং হেক্স সরাসরি, আমি ভীত (ECMA 334v4):
9.4.4.2 পূর্ণসংখ্যার লিটারালগুলি পূর্ণসংখ্যার লিটারালগুলি int, uint, দীর্ঘ এবং উলং প্রকারের মান লিখতে ব্যবহৃত হয়। পূর্ণসংখ্যার আক্ষরিকের দুটি সম্ভাব্য ফর্ম রয়েছে: দশমিক এবং হেক্সাডেসিমাল।
পার্স করতে, আপনি ব্যবহার করতে পারেন:
int i = Convert.ToInt32("01101101", 2);
এনামগুলিতে বিট পতাকা সম্পর্কিত @ স্ট্রিপলিং ওয়ারিয়রের উত্তরে যোগ করা, বিট শিফটগুলির মাধ্যমে উপরের দিকে গণনা করার জন্য আপনি হেক্সাডেসিমালে ব্যবহার করতে পারেন এমন একটি সহজ কনভেনশন রয়েছে। অনুক্রমটি 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 (শিফট) প্যাটার্নটি লক্ষ্য করুন ...
মূল প্রশ্নের উত্তর দেওয়ার জন্য, আমি হেক্সাডেসিমাল আক্ষরিক ব্যবহারের জন্য সাহুয়াগিনের পরামর্শকে দ্বিতীয় @ করি। আপনি যদি বাইনারি সংখ্যাসমূহ নিয়ে প্রায়শই যথেষ্ট উদ্বেগের জন্য কাজ করে থাকেন তবে হেক্সাডেসিমালের হ্যাং পাওয়ার পক্ষে এটি আপনার পক্ষে মূল্যবান।
যদি আপনার উত্স কোডে বাইনারি সংখ্যাগুলি দেখতে প্রয়োজন হয় তবে আমি আমার উপরের মত বাইনারি আক্ষরিক সাথে মন্তব্য যুক্ত করার পরামর্শ দিচ্ছি।
আপনি সর্বদা অর্ধ-আক্ষরিক, ধ্রুবক তৈরি করতে পারেন যা আপনার পরে মূল্য রয়েছে:
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);
আপনি যদি নেট সংকলক প্ল্যাটফর্মের ভাষা বৈশিষ্ট্য প্রয়োগের স্থিতিটি ("রোজলিন") দেখেন তবে আপনি পরিষ্কার দেখতে পাচ্ছেন যে সি # 6.0 এ এটি একটি পরিকল্পিত বৈশিষ্ট্য, সুতরাং পরবর্তী প্রকাশে আমরা এটি স্বাভাবিক উপায়ে করতে পারি।
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,
}
:-) নিল
বাইনারি আক্ষরিক বৈশিষ্ট্যটি সি # 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}");
লিটারাল ব্যবহার সম্ভব না হলেও, সম্ভবত একটি বিটকনভার্টারও সমাধান হতে পারে?
BitConverter.IsLittleEndian
, যা আপনি হোস্ট মেশিনটি সামান্য এন্ডিয়ান না হলে পরীক্ষা করতে (এবং একটি বাফারকে বিপরীত করতে) ব্যবহার করতে পারেন।
স্ট্রিং পার্সিং সলিউশনটি সর্বাধিক জনপ্রিয় হলেও আমি এটি পছন্দ করি না, কারণ পার্সিং স্ট্রিং কিছু পরিস্থিতিতে দুর্দান্ত পারফরম্যান্স হিট হতে পারে।
যখন কোনও ধরণের বিটফিল্ড বা বাইনারি মাস্কের প্রয়োজন হয়, আমি বরং এটি লিখতে চাই
দীর্ঘ বিটমাস্ক = 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;
}
}
মূলত, আমি মনে করি উত্তরটি কোনও, কোনও সহজ উপায় নেই। দশমিক বা হেক্সাডেসিমাল ধ্রুবক ব্যবহার করুন - এগুলি সহজ এবং স্পষ্ট। @ রয়টাইঙ্কার্স উত্তরটিও ভাল - একটি মন্তব্য ব্যবহার করুন।
int someHexFlag = 0x010; // 000000010000
int someDecFlag = 8; // 000000001000
অন্যদের উত্তরগুলি এখানে বেশ কয়েকটি দরকারী কাজের-একটি রাউন্ড উপস্থাপন করে তবে আমি মনে করি যে তারা সহজ উত্তর পরে আর ভাল নয়। সি # ভাষা ডিজাইনার সম্ভবত একটি '0 বি' উপসর্গটিকে অপ্রয়োজনীয় বলে মনে করেছিলেন। এইচএক্স বাইনারি রূপান্তরিত করা সহজ, এবং বেশিরভাগ প্রোগ্রামাররা যাইহোক 0-8 এর ডিসি সমতুল্য জানতে হবে।
এছাড়াও, ডিবাগারে মানগুলি পরীক্ষা করার সময়, তাদের HEX বা DEC প্রদর্শিত হবে।
if (a == MaskForModemIOEnabled)
চেয়ে পড়তে চাইif (a == 0b100101)