"(আন্তঃ) মান এবং 0x1, (অন্তর্নির্মিত) মান এবং 0x2, (অন্তর্) মান এবং 0x4, (অন্তর্নির্মিত) মান এবং 0x8" এর অর্থ কী? "


11

কোড

"মান" 0 থেকে 15 (এর সম্ভাব্য মান) এর মধ্যে রয়েছে। কখন এই 4 "যদি" শর্ত পূরণ হবে? যদি আমার (অন্তর্গত) মান = 2 এর অর্থ 0010?

            if  ((int)value & 0x1) 
            {
                //statement here
            }
            if  ((int)value & 0x2) 
            {
                //statement here
            }
            if  ((int)value & 0x4) 
            {
                //statement here
            }
            if  ((int)value & 0x8) 
            {
                //statement here
            }

3
এগুলি বিটমাস্কগুলি পৃথক বিটের জন্য যাচাই করে নিচ্ছেvalue ( if(value & 0x4)এটি " valueসেট এর তৃতীয় বিট (= 1) হিসাবে পড়ুন) As আপনার কোডটি বোঝার ক্ষেত্রে আপাতদৃষ্টিতে সমস্যা হওয়ায় আমি ধরে নিলাম এটি আপনার নয় This এটি (এবং আপনি সত্যই জিজ্ঞাসা করছেন না পর্যালোচনা) জন্য এই প্রশ্নের প্রসঙ্গ-বহির্ভূত তোলে CR.SE
কেউ

আরও ভাল বোঝার জন্য, সি # তে পোর্ট করা একই জাতীয় কোড Enum.HasFlagবিটগুলির জন্য পরীক্ষার জন্য পদ্ধতিটি ব্যবহার করবে । দেখুন: Enum.HasFlag
rwong

উত্তর:


12

প্রতিটি সংখ্যা value = b0*2^0 + b1*2^1 + b2*2^2 + b3*2^3 + ...প্রতিটি খ হিসাবে হয় 0বা 1(এটি উপস্থাপনের বিট হয়) হিসাবে প্রকাশ করা যেতে পারে । এটি বাইনারি উপস্থাপনা।

বাইনারি এবং ( &) bবুদ্ধিমান এবং পারফরম্যান্স করে এবং তাদের জুড়ে pair জোড়গুলির প্রত্যেককে নেয় । এটির নিম্নলিখিত ফলাফল রয়েছে:

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

২ এর শক্তি ব্যবহার করে (যার কেবলমাত্র একটি মাত্র বিট থাকে) আমরা পৃথক বিটগুলি বিচ্ছিন্ন করে পরীক্ষা করতে পারি:

  • value & 1যখন valueবিজোড় {1, 3, 5, 7, 9, 11, 13, 15 when হয় ঠিক হয়}

  • value & 2যখন value/2বিজোড় {2, 3, 6, 7, 10, 11, 14, 15 when হয় ঠিক হয়}

  • value & 4যখন value/4বিজোড় {4, 5, 6, 7, 12, 13, 14, 15} হয় ঠিক হয়}

  • value & 8value/8বিজোড় {8, 9, 10, 11, 12, 13, 14, 15 d হলে সত্য true

সংখ্যার 0x প্রিফেক্সের অর্থ এটি হেক্সাডেসিমাল সংখ্যা হিসাবে ব্যাখ্যা করা উচিত । আপনি যখন কেবল 0x8 পর্যন্ত যান তবে এটি সম্ভবত বিটমাস্ক হিসাবে ব্যবহৃত হয় যখন এটি কিছুটা অতিরিক্ত অতিরিক্ত হয় maintain


1
শব্দগুচ্ছটি বলতে পারে যে এটি সমস্ত সংখ্যায় বাড়ানো যেতে পারে, যা সত্য নয়: 8/6অদ্ভুত, আর 8&6ফলন মিথ্যা।
সোজিয়ার্ড

@ সুজার্ড যে কারণে আমি "পাওয়ার 2" বলেছি
রাচেট ফ্রিক

5

এই যদি বিবৃতিগুলি নির্দিষ্ট বিট valueসেট আছে কিনা তা পরীক্ষা করে।

0x4উদাহরণস্বরূপ, হেক্সাডেসিমাল মানটির ডান সেট থেকে 3 bit বিট রয়েছে 1এবং অন্য সমস্ত বিট সেট করা আছে 0। আপনি যখন &দুটি অপারেটর সহ বাইনারি-এবং অপারেটর ( ) ব্যবহার করেন , ফলস্বরূপ 0উভয় অপারেটরে 1 বিট ব্যতীত সমস্ত বিট সেট করা থাকবে।

সুতরাং আপনি যখন গণনা করেন value & 0x4, আপনি হয় বাইনারি 00000000বা বাইনারি পান 00000100, 3 য় বিট valueহয় 1বা না তার উপর নির্ভর করে 0। প্রথমটিতে মূল্যায়ন করা হয় falseএবং দ্বিতীয়টি true, যাতে if-block কেবলমাত্র তৃতীয় বিট সেট করা মানগুলির জন্য কার্যকর করা হয়।


1

এখানে দুটি আকর্ষণীয় বিষয় লক্ষণীয়।

প্রথমত, অবিচ্ছেদ্য মানের প্রতিটি নিম্ন-অর্ডার 4 বিটগুলির প্রত্যেকটি পরীক্ষা করার জন্য এটি একটি সাধারণ প্যাটার্ন। সংশ্লিষ্ট বিট সেট করা থাকলে if শর্ত পূরণ করা হয়। মান 2 এর জন্য বিট প্যাটার্নটি আসলে 0010।

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

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