পতাকা এনামগুলি কেন সাধারণত হেক্সাডেসিমাল মানগুলির সাথে সংজ্ঞায়িত করা হয়


121

আমি বহু বার পতাকা এনাম ঘোষণা দেখতে পাই যা হেক্সাডেসিমাল মান ব্যবহার করে। উদাহরণ স্বরূপ:

[Flags]
public enum MyEnum
{
    None  = 0x0,
    Flag1 = 0x1,
    Flag2 = 0x2,
    Flag3 = 0x4,
    Flag4 = 0x8,
    Flag5 = 0x10
}

যখন আমি একটি এনাম ঘোষণা করি, আমি সাধারণত এটির মতো ঘোষণা করি:

[Flags]
public enum MyEnum
{
    None  = 0,
    Flag1 = 1,
    Flag2 = 2,
    Flag3 = 4,
    Flag4 = 8,
    Flag5 = 16
}

কিছু লোক কেন দশমিকের চেয়ে হেক্সাডেসিমালে মান লিখতে পছন্দ করে তার কোনও যুক্তি বা যুক্তি রয়েছে? আমি এটি যেভাবে দেখছি, হেক্স মানগুলি ব্যবহার করার সময় বিভ্রান্ত হওয়া এবং দুর্ঘটনাক্রমে Flag5 = 0x16পরিবর্তে লিখতে আরও সহজ Flag5 = 0x10


4
আপনি দশমিক সংখ্যা ব্যবহার 10না করে লেখার চেয়ে কম কিছুর সম্ভাবনা রয়েছে 0x10? বিশেষত যেহেতু এগুলি বাইনারি সংখ্যার সাথে আমরা কাজ করছি এবং হেক্স বাইনারি থেকে / থেকে তুচ্ছ রূপান্তরিত হয়? 0x111কারও মাথায় অনুবাদ করা কম বিরক্তিকর 273...
সিএওও

4
এটি লজ্জার বিষয় যে সি # এর এমন একটি বাক্য গঠন নেই যা স্পষ্টভাবে দুটির শক্তি লেখার প্রয়োজন হয় না।
কর্নেল আতঙ্ক

আপনি এখানে কিছু অযৌক্তিক কিছু করছেন। পতাকাগুলির পিছনে উদ্দেশ্যটি হ'ল এগুলি বিটওয়াইস সমন্বিত হবে। তবে বিটওয়াইস সংমিশ্রণগুলি ধরণের উপাদান নয়। মান Flag1 | Flag23, এবং 3 এর কোনও ডোমেন মানের সাথে মিলে না MyEnum
কাজ

তুমি কোথায় দেখছ? প্রতিবিম্বের সাথে?
giammin

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

উত্তর:


183

রেশনএলস পৃথক হতে পারে, তবে একটি সুবিধা আমি দেখতে পাচ্ছি হেক্সাডেসিমাল আপনাকে স্মরণ করিয়ে দিচ্ছে: "ঠিক আছে, আমরা বেস দশের স্বেচ্ছাসেবীর মানব-উদ্ভাবিত বিশ্বে সংখ্যার সাথে কাজ করছি না dealing আমরা বিটগুলি - মেশিনের জগতের সাথে কাজ করছি - এবং আমরা 'তার নিয়ম অনুসারে খেলতে যাব। " হেক্সাডেসিমাল খুব কম ব্যবহার করা হয় যদি না আপনি তুলনামূলকভাবে নিম্ন-স্তরের বিষয়গুলিতে ডিল করেন যেখানে ডেটা মেমরির বিন্যাসের বিষয়টি গুরুত্বপূর্ণ। এটি ব্যবহার করে এটি আমাদের ইঙ্গিত দেয় যে আমরা এখন এই পরিস্থিতিতে রয়েছি।

এছাড়াও, আমি সি # সম্পর্কে নিশ্চিত নই, তবে আমি জানি যে সি x << yতে একটি বৈধ সংকলন-সময় ধ্রুবক। বিট শিফট ব্যবহার করা সবচেয়ে পরিষ্কার বলে মনে হচ্ছে:

[Flags]
public enum MyEnum
{
    None  = 0,
    Flag1 = 1 << 0,
    Flag2 = 1 << 1,
    Flag3 = 1 << 2,
    Flag4 = 1 << 3,
    Flag5 = 1 << 4
}

7
এটি খুব আকর্ষণীয় এবং এটি আসলে একটি কার্যকর সি # এনওমও।
আদি লেস্টার

13
এই চিহ্নটি সহ +1 আপনি কখনই এনাম মান গণনায় ত্রুটি করবেন না
সের্গেই বেরেজোভস্কি

1
@ অ্যালনগুরালেনেক: সংকলকটি [পতাকাগুলি] টিকা দেওয়ায় অনন্য বিট অবস্থান নির্ধারণ করে? সাধারণত এটি 0 থেকে শুরু হয় এবং 1 এর ইনক্রিমেন্টে যায়, সুতরাং 3 (দশমিক) নির্ধারিত কোনও এনাম মান বাইনারি হয়ে 11 হবে, দুটি বিট সেট করবে।
এরিক জে।

2
@ এরিক: হু, আমি জানি না কেন তবে আমি সর্বদা নিশ্চিত ছিলাম যে এটি দুটির শক্তির মূল্য নির্ধারণ করেছে। আমি শুধু পরীক্ষা করেছিলাম, এবং আমার ধারণা ছিল আমার ভুল ছিল।
অ্যালন গুরালেক

38
x << yস্বরলিপি সহ আরও একটি মজার ঘটনা । 1 << 10 = KB, 1 << 20 = MB, 1 << 30 = GBএবং তাই। এটি খুব সুন্দর যদি আপনি বাফারের জন্য 16 কেবি অ্যারে করতে চান তবে আপনি যেতে পারেনvar buffer = new byte[16 << 10];
স্কট চেম্বারলাইন

43

এগুলি বাইনারি পতাকাগুলি দেখতে এটি সহজ করে তোলে ।

None  = 0x0,  // == 00000
Flag1 = 0x1,  // == 00001
Flag2 = 0x2,  // == 00010
Flag3 = 0x4,  // == 00100
Flag4 = 0x8,  // == 01000
Flag5 = 0x10  // == 10000

যদিও অগ্রগতি এটি আরও স্পষ্ট করে তোলে:

Flag6 = 0x20  // == 00100000
Flag7 = 0x40  // == 01000000
Flag8 = 0x80  // == 10000000

3
আমি আসলে 0x1, 0x2, 0x4, 0x8 এর সামনে একটি 0 যুক্ত করেছি ... সুতরাং আমি 0x01, 0x02, 0x04, 0x08 এবং 0x10 পেয়েছি ... আমি পড়তে আরও সহজ মনে করি। আমি কি কিছু ঝামেলা করছি?
লাইটস্ট্রাইকার

4
@ লাইট - মোটেও না এটি খুব সাধারণ তাই আপনি দেখতে পাচ্ছেন কীভাবে এই সারিবদ্ধ হয়। শুধু বিট আরো স্পষ্ট :) তোলে
ওবেদের

2
@LightStriker শুধু এটা আউট আছে যে নিক্ষেপ করবে না যদি আপনি হেক্স ব্যবহার করছেন না ব্যাপার। কেবলমাত্র একটি শূন্য দিয়ে শুরু হওয়া মানগুলি অষ্টাল হিসাবে ব্যাখ্যা করা হয়। তাই 012আসলে 10
জোনাথন রেইনার্ট

@ জোনাথন রাইনহার্ট: আমি জানি। তবে বিটফিল্ড ব্যবহার করার সময় আমি সর্বদা হেক্স ব্যবহার করি। আমি নিশ্চিত না যে intপরিবর্তে আমি নিরাপদ ব্যবহার করব । আমি জানি এটি বোকা ... তবে অভ্যাসগুলি কঠোরভাবে মারা যায়।
লাইটস্ট্রাইকার

36

আমি মনে করি এটি কেবল কারণ ক্রমটি সর্বদা 1,2,4,8 এবং তারপরে একটি 0 যুক্ত করুন
আপনি দেখতে পাচ্ছেন:

0x1 = 1 
0x2 = 2
0x4 = 4
0x8 = 8
0x10 = 16
0x20 = 32
0x40 = 64
0x80 = 128
0x100 = 256
0x200 = 512
0x400 = 1024
0x800 = 2048

এবং এইভাবে, যতক্ষণ আপনি 1-2-2-2-8 ক্রমটি মনে রাখবেন আপনি 2 এর শক্তির কথা মনে না রেখে পরবর্তী সমস্ত পতাকা তৈরি করতে পারবেন


13

কারণ [Flags]উপায়ে যে enum সত্যিই একটি হল bitfield । ফ্ল্যাগগুলি একত্রিত করার জন্য [Flags]আপনি বিটওয়াইড এবং ( &) এবং ওআর ( |) অপারেটরগুলি ব্যবহার করতে পারেন । এটির মতো বাইনারি মানগুলির সাথে কাজ করার সময়, হেক্সাডেসিমাল মানগুলি ব্যবহার করা প্রায় সবসময়ই আরও স্পষ্ট clear এটিই প্রথম কারণেই আমরা হেক্সাডেসিমাল ব্যবহার করি । প্রতিটি হেক্স অক্ষর হুবহু এক ভঙ্গুর (চার বিট) এর সাথে মিলে যায়। দশমিক সহ, এই 1-থেকে -4 ম্যাপিংটি সত্য ধারণ করে না।


2
বিটওয়াইজ অপারেশনগুলি ব্যবহারের দক্ষতার সাথে পতাকা বৈশিষ্ট্যের সাথে আসলে কোনও সম্পর্ক নেই।
ম্যাটিয়াস নর্ডকভিস্ট

4

কারণ হেক্সে পাওয়ার-অফ-টু দ্বিগুণ করার জন্য একটি যান্ত্রিক, সহজ উপায় রয়েছে। দশমিক, এটি কঠিন। এটি আপনার মাথায় দীর্ঘ গুণ প্রয়োজন। হেক্সে এটি একটি সাধারণ পরিবর্তন। 1UL << 63দশমিকের মধ্যে আপনি যা করতে পারবেন না এমনভাবে আপনি এটি চালিয়ে যেতে পারেন।


1
আমি মনে করি এটি সবচেয়ে সার্থক করে তোলে। মানগুলির একটি বৃহত সেট সহ এনামগুলির জন্য এটি যাওয়ার সহজতম উপায় (@ হাইপারকিউবের উদাহরণের সম্ভাব্য ব্যতিক্রম সহ)।
আদি লেস্টার

3

কারণ পতাকাগুলি যেখানে বিটগুলি রয়েছে সেখানে মানুষের পক্ষে অনুসরণ করা আরও সহজ। প্রতিটি হেক্সাডেসিমাল ডিজিট 4 বিট বাইনারি ফিট করতে পারে

0x0 = 0000
0x1 = 0001
0x2 = 0010
0x3 = 0011

... and so on

0xF = 1111

সাধারণত আপনি চান যে আপনার পতাকাগুলি বিটগুলি ওভারল্যাপ না করে, এটি করার এবং এটির দৃশ্যধারণের সহজতম উপায় হেক্সাডেসিমাল মানগুলি ব্যবহার করে আপনার পতাকাগুলি ঘোষণা করে।

সুতরাং, যদি আপনার 16 টি বিট সহ পতাকাগুলির দরকার হয় তবে আপনি 4 ডিজিটের হেক্সাডেসিমাল মান ব্যবহার করবেন এবং এইভাবে আপনি ভুল মানগুলি এড়াতে পারবেন:

0x0001 //= 1 = 000000000000 0001
0x0002 //= 2 = 000000000000 0010
0x0004 //= 4 = 000000000000 0100
0x0008 //= 8 = 000000000000 1000
...
0x0010 //= 16 = 0000 0000 0001 0000
0x0020 //= 32 = 0000 0000 0010 0000
...
0x8000 //= 32768 = 1000 0000 0000 0000

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