বিট-ওয়াইজ অপারেশনগুলির সাথে একটি ভাল গোলাকার প্রোগ্রামারটির কতটা ভাল হওয়া দরকার? [বন্ধ]


34

আমি সম্প্রতি কিছু OpenJDK কোড ব্রাউজিং করা হয়েছে এবং কিছু পাওয়া যায় কুচুটে সেখানে কোড সহ কি আছে যে টুকরা বিট-জ্ঞানী অপারেশন । এমনকি স্ট্যাকওভারফ্লোতে এটি সম্পর্কে একটি প্রশ্ন জিজ্ঞাসা করেছি।

আরেকটি উদাহরণ যা দৃষ্টান্তটি তুলে ধরে:

 1141       public static int bitCount(int i) {
 1142           // HD, Figure 5-2
 1143           i = i - ((i >>> 1) & 0x55555555);
 1144           i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
 1145           i = (i + (i >>> 4)) & 0x0f0f0f0f;
 1146           i = i + (i >>> 8);
 1147           i = i + (i >>> 16);
 1148           return i & 0x3f;
 1149       }

এই কোডটি পূর্ণসংখ্যা শ্রেণিতে পাওয়া যাবে ।

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

বিট-ওয়াইজ অপারেশনগুলির সাথে একটি ভাল গোলাকার প্রোগ্রামারটির কতটা ভাল হওয়া দরকার?

পাশের নোটে ... আমাকে যে বিষয়টি চিন্তিত করছে তা হ'ল যে ব্যক্তি আমার প্রশ্নের উত্তর স্ট্যাকওভারফ্লোতে দিয়েছিল সে কয়েক মিনিটের মধ্যেই এর উত্তর দিয়েছিল। তিনি যদি তা করতে পারতেন তবে আমি কেন হেডলাইটে হরিণের মতো তাকালাম?


4
আপনি কোন ধরণের উন্নয়ন কাজ করেন (বা যদি আপনি এখনই এটি না করে থাকেন তবে) করতে চান? আমি এটি ওয়েব বিকাশে কার্যকর হতে দেখছি না তবে এম্বেড থাকা সিস্টেমের কাজগুলিতে আমি অনেক বিটওয়াইজ অপারেশন দেখেছি।
টমাস মালিকের

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

11
>>>অপারেটর হিসাবে পৃথিবীতে কী আছে ?
ডেডএমজি

10
@ ডেড এমজি: স্বাক্ষরবিহীন ডান শিফট। download.oracle.com/javase/tutorial/java/nutsandbolts/op3.html
c_maker

3
// HD, Figure 5-2আমি একবার তাকান প্রথম জিনিস হবে। ফাইলের শুরুতে মন্তব্য অনুযায়ী, HDহয় Henry S. Warren, Jr.'s Hacker's Delight
schnaader

উত্তর:


38

আমি বলব যে একটি গোলাকার বিকাশকারী হিসাবে আপনাকে অপারেটরগুলি এবং বিটওয়াইজ অপারেশনগুলি বুঝতে হবে।

সুতরাং, সর্বনিম্ন, আপনার কিছুটা চিন্তাভাবনা করার পরে উপরের কোডটি বের করতে সক্ষম হওয়া উচিত।

বিটওয়াইজ অপারেশনগুলি বরং নিম্ন স্তরের হয়ে থাকে, সুতরাং আপনি যদি ওয়েবসাইট এবং এলওবি সফটওয়্যারটিতে কাজ করেন তবে আপনি সেগুলি বেশি ব্যবহার করার সম্ভাবনা নেই।

অন্যান্য জিনিসের মতো, আপনি যদি এগুলিকে বেশি ব্যবহার না করেন তবে আপনি সেগুলিতে কথোপকথন হবেন না।

সুতরাং, কেউ খুব তাড়াতাড়ি এটি বের করতে সক্ষম হওয়ার বিষয়ে আপনার চিন্তা করা উচিত নয় , কারণ তারা (সম্ভবত) এই ধরণের কোড দিয়ে অনেক বেশি কাজ করে। সম্ভবত ওএস কোড, ড্রাইভার কোড বা অন্যান্য কৌশলযুক্ত বিট ম্যানিপুলেশন লেখা।


1
+1: বিটওয়াইজ অপারেশনগুলি কোনও বিকাশকারীদের জন্য জ্ঞানের একটি গুরুত্বপূর্ণ বিট (কোনও শঙ্কিত উদ্দেশ্য নয়), তবে তারা এখন নির্দিষ্ট পরিস্থিতিতে কেবল সত্যই গুরুত্বপূর্ণ। যদি আপনি আপনার দিনের বেলাতে কখনই সেগুলিতে আসেন না তবে সাধারণ জ্ঞান রাখা তাদের উপর দাসত্ব করার চেয়ে ভাল। মস্তিষ্কের জায়গাটি মুক্ত রাখুন।
নিকোলাস স্মিথ

আপনারা বুঝতে হবে যে আপনি কখন এগুলি ব্যবহার করবেন এবং যদি তারা যদি সমস্যার মুখোমুখি হয় তবে তাদের ব্যবহার থেকে লজ্জা পাবে না।
ব্যবহারকারী 606723

@ ইউজার 606723 এর মন্তব্যে যোগ করতে - সত্যই এমন কয়েকটি জায়গা রয়েছে যেখানে বিটওয়াইজ স্টাফ সাধারণত ব্যবহৃত হয় এবং সেগুলি কম বেশি দেখা যায় - হ্যাশিং (এবং এর সাথে সম্পর্কিত জিনিসগুলি) এবং আরজিবি'র নির্দিষ্ট রঙগুলি বের করা / সেট করা যদি তারা থাকে 'একটি মধ্যে সঞ্চিত int। উদাহরণস্বরূপ, সিপিইউ তথ্য একটি নির্দিষ্ট নিবন্ধ থেকে ফিরে আসা বিট পতাকাগুলি পরীক্ষা করে পড়া যায়, তবে এতে এসএম জড়িত থাকে এবং প্রয়োজনে সাধারণত উচ্চতর lvl মোড়ক থাকে।
TC1

36

আপনি যদি বুঝতে পারেন যে "বিট 3 এবং 8 সেট করা আছে কিনা তা নির্ধারণ করুন", "" বিট 5 সাফ করুন "বা" বিটগুলি 7-12 দ্বারা উপস্থাপিত পূর্ণসংখ্যার মান সন্ধান করুন "আপনার কাছে ক্যান পরীক্ষা করার জন্য বিটওয়াইস অপারেটরদের যথেষ্ট পরিমাণে উপলব্ধি থাকতে পারে "ভাল বৃত্তাকার" চেকলিস্টে টুইল বিটস বাক্স box

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

এমনকি যদি আপনি এই অ্যালগরিদমগুলি বুঝতে না পারেন, কেবলমাত্র তাদের অস্তিত্বগুলি জেনে রাখা আপনার "বৃত্তাকার" বাড়িয়ে তোলে কারণ যখন সময় আসে যখন বলুন, উচ্চ-পারফরম্যান্সের বিট গণনা করা হবে তখন আপনি কী অধ্যয়ন করবেন তা জানেন। প্রাক-গুগল বিশ্বে এই বিষয়গুলি সম্পর্কে সন্ধান করা অনেক কঠিন ছিল; এখন এটি কীস্ট্রোক দূরে।

যে ব্যবহারকারী আপনার এসও প্রশ্নের উত্তর দিয়েছেন তিনি সমস্যাটি আগে দেখেছেন বা হ্যাশিং অধ্যয়ন করেছেন। তাকে লিখুন এবং জিজ্ঞাসা করুন।


কমপক্ষে এই বিষয়গুলি সম্পর্কে সচেতন থাকার বিষয়ে +1। অনেক কিছু সম্পর্কে কিছুটা জানা ভাল জিনিস। শিল্পের লোকেরা যদি এ জাতীয় স্টাফ নিয়ে কথা বলতে শুরু করে তবে আপনি যে ঘরে আলোচিত হচ্ছেন সেটির সামান্যতম সূত্র নেই এমন লোক হতে চান না।
maple_shaft

3
উপরের কোড মন্তব্যে "এইচডি" সংক্ষেপটি সমাধানের জন্য +1।
প্যাটার টারিক

আমি এই জাতীয় জিনিস পছন্দ করি এবং কেবল এইচডি বইয়ের অর্ডার করি। রেফারেন্সের জন্য ধন্যবাদ।
tcrosley

8

আপনার উদাহরণ থেকে এমন কিছু জিনিস রয়েছে যা আপনার সত্যিকারের চিন্তা না করে একেবারে জানা উচিত।

1143 আই = আই - ((আমি >>> 1) & 0x55555555);

আপনার বিট প্যাটার্ন 0x555 চিনতে হবে ... বিকল্প বিট প্যাটার্ন 0101 0101 0101 হিসাবে এবং অপারেটররা এটি 1 বিট (ডানদিকে) অফসেট করছে, এবং এটি একটি মাস্কিং অপারেশন (এবং মাস্কিং মানে)।

1144 আই = (আমি & 0x33333333) + ((আমি >>> 2) & 0x33333333);

আবার একটি নিদর্শন হিসাবে এটি এক 0011 0011 0011 Also এছাড়াও এটি এটি এখন দুটি স্থানান্তরিত করে আবারও মুখোশ। শিফটিং এবং মাস্কিং এমন একটি প্যাটার্ন অনুসরণ করছে যা আপনাকে চিনতে হবে ...

1145 আই = (আই + (আমি >>> 4)) এবং 0x0f0f0f0f;

প্যাটার্ন দৃif় হয়। এবার এটি 00001111 00001111 এবং অবশ্যই, আমরা এইবার 4 টি স্থানান্তর করছি। প্রতিবার আমরা মুখোশের আকারে সরে যাচ্ছি।

1148 রিটার্ন আমি & 0x3f;

আরেকটি বিট প্যাটার্ন, 3f হ'ল শূন্যগুলির একটি ব্লক এবং এরপরে একটি বৃহত ব্লক।

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

এমনকি উচ্চ স্তরের ভাষায়, বিট প্যাটারগুলি ছোট ক্ষেত্রগুলিতে প্রচুর পরিমাণে ডেটা সঞ্চয় করতে ব্যবহৃত হয়। এ কারণেই আপনি গেমগুলিতে সর্বদা 127/8, 63/4 এবং 255/6 এর সীমা দেখেন, কারণ আপনার এতগুলি জিনিস সংরক্ষণ করতে হবে যে ক্ষেত্রগুলি প্যাক না করেই আপনি দশগুণ ব্যবহার করতে বাধ্য হবেন স্মৃতি পরিমাণ। (ঠিক আছে, চূড়ান্তটি হ'ল যদি আপনাকে অ্যারেতে বিপুল সংখ্যক বুলিয়ান সংরক্ষণ করতে হয় তবে আপনি যদি মনে না করেন তবে আপনি 32-64 গুণ মেমরি ব্যবহার করতে পারবেন - বেশিরভাগ ভাষাগুলি বুলিয়ান হিসাবে প্রয়োগ করে এমন একটি শব্দ যা প্রায়শই 32 বিট হবে। যাঁরা এই স্তরে স্বাচ্ছন্দ্য বোধ করেন না তারা কেবল অজানা থেকে ভীত হওয়ার কারণে এই জাতীয় ডেটা সঞ্চয় করার সুযোগগুলি প্রতিরোধ করবেন।

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


5

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

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


4

আপনার প্রধান বিষয়গুলি সম্পর্কে সচেতন হওয়া উচিত হ'ল পূর্ণসংখ্যাগুলি কীভাবে উপস্থাপিত হয় (সাধারণভাবে একটি নির্দিষ্ট দৈর্ঘ্যের বিটভেেক্টর যেখানে দৈর্ঘ্য প্ল্যাটফর্ম নির্ভর)

মূল গাণিতিক ক্রিয়াকলাপগুলি + - * / %মাইক্রো-অপ্টিমাইজেশনের জন্য কার্যকর হতে পারে যদিও এটি না বোঝার প্রয়োজন ছাড়াই বোঝা যায় (যদিও বেশিরভাগ সময় সংকলকটি আপনার জন্য এটি যত্ন নিতে সক্ষম হবে)

বিট ম্যানিপুলেশন | & ~ ^ << >> >>>সেটগুলিকে ব্যবহার করতে সক্ষম হতে কমপক্ষে একটি পাসিং বোধগম্য প্রয়োজন

তবে বেশিরভাগ সময় আপনি এগুলি কেবল কোনও পদ্ধতিতে বিট ফ্ল্যাগগুলি ব্যবহার করার জন্য ব্যবহার করবেন যেমন ORএকত্রে ANDসিঙ্গেল হয়ে যাওয়া এবং কোনও ইন্টি পাস করা এবং তারপরে সেটিংস আউট করা দীর্ঘ প্যারামিটার তালিকায় বেশ কয়েকটি (32 অবধি) বুলিয়ান পাস করার চেয়ে বেশি পঠনযোগ্য এবং অনুমতি দেয় ইন্টারফেস পরিবর্তন না করেই সম্ভাব্য পতাকাগুলি পরিবর্তন করা যায়

ফ্ল্যাঙ্কগুলির মতো একত্রে প্যাকিংয়ের পরিবর্তে বুলেটগুলি সাধারণত বাইট বা ইনটগুলিতে আলাদাভাবে রাখা হয় তা উল্লেখ না করা


কোড স্নিপেট হিসাবে এটি বিটের সমান্তরাল গণনা করে যা এটি অ্যালগরিদমকে চালাতে দেয় O(log(n))যেখানে n নিখুঁত লুপের পরিবর্তে বিটের সংখ্যা যেখানে হয়O(n)

প্রথম পদক্ষেপ কঠিন বুঝতে কিন্তু আপনি সেটআপ এটা বিট ক্রমের প্রতিস্থাপন আছে থেকে শুরু করে 0b00করতে 0b00, 0b01করতে 0b01, 0b10করতে 0b01এবং 0b11করতে 0b10এটা অনুসরণ করা সহজ হয়ে

সুতরাং প্রথম পদক্ষেপের জন্য i - ((i >>> 1) & 0x55555555)যদি আমরা iসমান হতে পারি 0b00_01_10_11তবে এর আউটপুট হওয়া উচিত0b00_01_01_10

(নোট যে 0x5সমান 0b0101)

iuf আমরা নিতে i = 0b00_01_10_11মানে হল এই যে 0b00_01_01_10 - (0b00_00_11_01 & 0b01_01_01_01)হয় 0b00_01_10_11 - 0b00_00_01_01পালাক্রমে হয়ে যা0b00_01_01_10

তারা (i & 0x55555555) + ((i >>> 1) & 0x55555555)একই ফলাফলের জন্য করতে পারত তবে এটি 1 অতিরিক্ত অপারেশন

নিম্নলিখিত পদক্ষেপগুলি একই শিরাতে রয়েছে


4
এই কোডটির সর্বাধিক গুরুত্বপূর্ণ গুণটি হ'ল এটি শাখা মুক্ত যা সম্ভবত জটিলতা হ্রাসের চেয়ে আরও বেশি সুবিধা দেয়।
সাইমন রিখর

3

প্রত্যেকেরই বেসিক বিট-ওয়াইজ অপারেশনগুলি বোঝা উচিত। এটি একটি অনুকূলিত, দৃ way় উপায়ে কার্য সম্পাদন করার জন্য মৌলিক ক্রিয়াকলাপগুলির রচনা যা প্রচুর অনুশীলন করে।

যারা প্রতিদিন বিট ম্যানিপুলেশন নিয়ে কাজ করেন (এম্বেডড লোকেরা যেমন) অবশ্যই তারা দৃ strong় স্বীকৃতি এবং কৌশলগুলির একটি দুর্দান্ত ব্যাগ বিকাশ করতে চলেছেন।

যে প্রোগ্রামার নিম্ন-স্তরের জিনিসগুলি না করে বিট-ওয়াইজ হেরফেরের সাথে কতটা দক্ষতা থাকা উচিত? মস্তিষ্কের টিজার বা ধাঁধা মতো এমন আস্তে আস্তে যেমন আপনি পেস্ট করেছেন এমন স্টাঞ্জার সাথে বসতে সক্ষম হবেন।

একই টোকেন দিয়ে, আমি বলব যে কোনও এম্বেড প্রোগ্রামার HTTP সম্পর্কে যতটা বুঝতে পারে যেমন একটি ওয়েব দেব বিট-ওয়াইজ ম্যানিপুলেশন সম্পর্কে বুঝতে পারে। অন্য কথায় আপনি যদি পুরোপুরি এটি ব্যবহার না করে থাকেন তবে বিট ম্যানিপুলেশনে উইজ না হওয়াই "ওকে"।


3
আসলে কিছু ক্ষেত্রে এম্বেড হওয়া প্রোগ্রামারকে কোনও ওয়েব বিকাশকারী (আমি উভয়ই করি না) এর চেয়ে http সম্পর্কে আরও বুঝতে হবে। ওয়েব বিকাশ করছেন, আপনি সাধারণত কিছু ধরণের কাঠামোর উপর নির্ভর করতে পারেন। এম্বেডড ডেভেলপার হিসাবে ইন্টারনেট-সংযুক্ত ডিভাইসগুলির সাথে কাজ করা, আমাকে স্ক্র্যাচ থেকে একটি এইচপি স্ট্যাক কোড করতে হয়েছিল।
tcrosley

@ টক্রোজলি, হ্যাঁ, আপনি একেবারে সঠিক। "এইচটিএমএল" এর চেয়ে সম্ভবত আরও ভাল উদাহরণটি "ওআরএম" বা "জেইই" এর মতো কিছু হতে পারে। মূল বিষয়টি হ'ল তারা নিয়মিত অনুশীলন না করে কিছু বিষয় নিয়ে দক্ষতা অর্জন করতে পারে না।
অ্যাঞ্জেলো

আমি সম্মত, এবং আমার কখনই ওআরএম বা জেইই (কখনই জেএমই ফিরে আসে যখন এটি জে 2 এমই বলা হয়েছিল) এর সাথে ডিল করতে হয়নি।
tcrosley

3

হ্যাকারের আনন্দের কাজ একটি ডেরাইভেটিভ কাজ। সকলের পূর্বপুরুষ হাকমেম 1972 সাল থেকে http://

গুরুত্বপূর্ণ বিষয়টি হ'ল যে কোনও কাজের জন্য সুস্পষ্ট অ্যালগরিদম অগত্যা সর্বোত্তম নয়। অনেকগুলি ক্ষেত্রেই রয়েছে যেখানে একটি অংশগত সমস্যার একটি মার্জিত সমাধানের অস্তিত্ব সম্পর্কে জেনে রাখা কী গুরুত্বপূর্ণ what's



3

বিটওয়াইজ অপারেটরদের ব্যাখ্যা করা কতটা কঠিন?

আমি এম্বেডেড সিস্টেমগুলি প্রোগ্রাম করি। আমি এই জিনিস প্রচুর অনুশীলন করেছি। কোড সহ হ্যাশ মানচিত্র সম্পর্কে আপনার লিঙ্কিত প্রশ্ন

static int hash(int h) {
   // This function ensures that hashCodes that differ only by
   // constant multiples at each bit position have a bounded
   // number of collisions (approximately 8 at default load factor).
   h ^= (h >>> 20) ^ (h >>> 12);
   return h ^ (h >>> 7) ^ (h >>> 4);
}

কোডটি জোরে জোরে শোনার জন্য যতক্ষণ না আমার সম্পর্কে নির্ভুল ধারণা তৈরি হয়েছিল perfect বর্ণিত ঘটনাগুলি bitCountতাত্ক্ষণিকভাবে পরিষ্কার, তবে এটি কেন বিটকে গণনা করে তা কার্যকর করতে এক মিনিট সময় নেয়। মন্তব্যগুলি দুর্দান্ত হবে, তবে কোডটি হ্যাশ সমস্যার তুলনায় কেবল কিছুটা শক্ত করে কী তা বোঝায়।

কোডটি পড়া এবং বোঝার মধ্যে পার্থক্য করা গুরুত্বপূর্ণ। আমি bitCountকোডটি ব্যাখ্যা করতে পারি এবং এটি কী করে তা পড়তে পারি, তবে কেন এটি কাজ করে তা প্রমাণ করে বা এটি কাজ করেও এক মিনিট সময় নেয়। কোডটি মসৃণভাবে পড়তে পারা এবং কোডটি কেন এমনভাবে হয় তা ছাঁটাইতে সক্ষম হওয়ার মধ্যে পার্থক্য রয়েছে। কিছু অ্যালগরিদম কেবল শক্ত। কি এর hashকোড অনুভূতি তৈরি, কিন্তু মন্তব্য ব্যাখ্যা কেন কৃতকর্মের হচ্ছে। যদি বিটওয়াইস অপারেটরগুলি ব্যবহার করে কোনও ফাংশন বোঝা শক্ত হয় তবে হতাশ হবেন না, তারা প্রায়শই ছদ্মবেশী গাণিতিক জিনিসগুলি ব্যবহার করেন যা বিন্যাসের কোনও কারণই নয় hard

একটি উপমা

আমি এই জিনিস অভ্যস্ত। একটি বিষয় যা আমি অভ্যস্ত নই তা হ'ল রেজেক্স। আমি তাদের সাথে মাঝে মাঝে স্ক্রিপ্টগুলি তৈরি করার বিষয়ে ডিল করি, তবে কখনই দৈনিক বিকাশের কাজে হয় না।

আমি জানি কীভাবে একটি রেজেক্সের নিম্নলিখিত উপাদানগুলি ব্যবহার করতে হয়:

  • [] অক্ষর ক্লাস
  • দ্য *, .এবং +ওয়াইল্ডকার্ডস
  • স্ট্রিংয়ের শুরু এবং স্ট্রিংয়ের ^সমাপ্তি$
  • \ D, \ w এবং character এর অক্ষর শ্রেণি
  • / জি পতাকা

এটি সাধারণ জিজ্ঞাসাগুলি তৈরির জন্য যথেষ্ট এবং আমি দেখছি এমন অনেকগুলি প্রশ্ন এ থেকে দূরে সরে যায় না।

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

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

আপনি কি এখানে বিটওয়াইজ অপারেটরদের সাথে আছেন?

আপনি ভাল বৃত্তাকার হতে চান?

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

  1. ফ্ল্যাশলি কমন অপারেশনগুলি পড়তে এবং লিখতে সক্ষম হন
    অ্যাপ্লিকেশন প্রোগ্রামারটির জন্য, বিটওয়াইজ অপারেটরগুলির সাথে সাধারণ অপারেশনগুলির প্রাথমিক অপারেটরগুলি |এবং &সেট সেট করতে এবং পতাকা পরিষ্কার করতে অন্তর্ভুক্ত থাকে । এটি সহজ হওয়া উচিত। আপনার মতো স্টাফ পড়তে এবং লিখতে সক্ষম হওয়া উচিত

    open('file', O_WRONLY | O_APPEND | O_CREAT );
    // Use an OR operator ^ here and ^ here to set multiple flags
    

    ধীর না করে (ধরে নিচ্ছেন যে পতাকাগুলি কী বোঝায় )।

  2. কিছু কাজ করে আরও জটিল ক্রিয়াকলাপগুলি পড়তে সক্ষম হোন
    শাখা ছাড়াই হে (লগ (এন)) সময়ে বিটগুলি গণনা করা সত্যিই দ্রুত, হ্যাশকোডের সংঘর্ষের সংখ্যা একটি সীমানা পরিমাণের সাথে পৃথক হতে পারে এবং ইমেল ঠিকানা , ফোন নম্বর , বা পার্সিং নিশ্চিত করে একটি রেইজেক্স সহ এইচটিএমএল কঠিন সমস্যা hard যারা এই অঞ্চলের বিশেষজ্ঞ নয় তাদের পক্ষে হোয়াইটবোর্ডের কাছে পৌঁছানো যুক্তিসঙ্গত, এটি বোঝার জন্য কাজ শুরু করতে অক্ষম হওয়া অযৌক্তিক।

  3. প্রচুর কাজের সাথে কিছু জটিল অ্যালগরিদম লিখতে সক্ষম হোন
    আপনি যদি বিশেষজ্ঞ না হন তবে আপনার জটিল এবং কঠিন স্টাফ করতে সক্ষম হওয়ার আশা করা উচিত নয়। তবে একটি ভাল প্রোগ্রামারকে এটি অবিচ্ছিন্নভাবে কাজ করে তা সম্পন্ন করতে সক্ষম হওয়া উচিত। এটি যথেষ্ট করুন, এবং আপনি শীঘ্রই বিশেষজ্ঞ হবেন :)


2

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

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


2

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

আমি বিটওয়াইস অপারেটরগুলি 5 বছর বা পিএইচপি (সম্ভবত এটি কেবলমাত্র আমার) এর মধ্যে 10 বছর বা তার বেশি উইন্ডোজ প্রোগ্রামিংয়ের মাধ্যমে নয়, যদিও কিছু নিম্ন স্তরের উইন্ডোজ স্টাফ প্যাক বিট করে না।

আপনি বলছেন "আমি যখন এটি দেখি তখন আমি সাহায্য করতে পারি না তবে বোকা বোধ করি"। করবেন না - রাগ অনুভব করুন।

আপনি সবেমাত্র একটি কাউবয় প্রোগ্রামার আউটপুট পূরণ করেছেন।

তিনি কি রক্ষণাবেক্ষণযোগ্য কোড লেখার কিছুই জানেন না? আমি আন্তরিকভাবে আশাবাদী যে তিনিই সেই ব্যক্তি যিনি এক বছরে ফিরে আসতে পারেন এবং চেষ্টা করে দেখুন এবং এর অর্থ কী remember

আমি জানি না আপনি মন্তব্যগুলি কাটেন বা কোনওটি না থাকলে, তবে এই কোডটি কোড পর্যালোচনাটি পাস করবে না যেখানে আমি স / ডাব্লু কিউএ পরিচালক ছিলেন (এবং আমি কয়েকবার হয়েছি))

এখানে থাম্বের একটি ভাল নিয়ম রয়েছে - কোডে অনুমোদিত "নগ্ন পূর্ণসংখ্যা" কেবলমাত্র 1 তম 1 other অন্যান্য সমস্ত সংখ্যা আপনার ভাষার উপর নির্ভর করে # ডিফাইন , ব্যয়, এনাম, ইত্যাদি হওয়া উচিত।

এই 3 এবং 0x33333333 যদি NUM_WIDGET_SHIFT_BITS এবং WIDGET_READ_MASK এর মতো কিছু বলে থাকে তবে কোডটি পড়া সহজ হত।

ওপেন সোর্স প্রকল্পে যারাই এটিকে প্রকাশ করে লজ্জাজনক, তবে এমনকি ব্যক্তিগত কোডের মন্তব্যের জন্যও ভাল অর্থবোধক সংজ্ঞা / এনাম ব্যবহার করুন এবং আপনার নিজস্ব কোডিং মান রয়েছে।


আমি হেক্স ধ্রুবককেও অনুমোদিত বলে বিবেচনা করব। 0xFF00(আমার কাছে) এর চেয়ে অনেক বেশি পাঠযোগ্য 0b1111111100000000। বিট সংখ্যা নির্ধারণের জন্য আমি গণনা করতে চাই না।
কেভিন ভার্মির

1

এই নির্দিষ্ট কোডের টুকরোটি হ্যাকার্স ডিলাইট বইয়ের বাইরে সরাসরি নেওয়া হয়েছে , চিত্র 5.2। এটি অনলাইন সি (পপ ফাংশন) এ এখানে । নোট করুন লেখক এখন আপডেট হওয়া সংস্করণগুলি ব্যবহার করার পরামর্শ দিয়েছেন: http://www.hackersdelight.org/HDcode/newCode/pop_arrayHS.c.txt

আপনি যদি এই ধরণের মাইক্রো-অপ্টিমাইজেশন শিখতে চান তবে আমি সেই বইয়ের পরামর্শ দেব; এটি মজাদার, তবে আপনি যদি খুব নিম্ন স্তরের বিট প্রোগ্রামিং না করেন তবে আপনি সম্ভবত এটি বুঝতে পারবেন না; এবং বেশিরভাগ সময় আপনার সংকলকটি আপনার জন্য এই ধরণের অনেকগুলি অনুকূলিতকরণ করতে সক্ষম হবে।

এটি বাইনারিতে সমস্ত হেক্সাডেসিমাল সংখ্যার পুনরায় লিখনে এই ধরণের অ্যালগোরিদমগুলি বুঝতে এবং সেগুলির মাধ্যমে একটি বা দুটি পরীক্ষার ক্ষেত্রে কাজ করতে সহায়তা করে।


1

উদাহরণ দ্বারা ব্যাখ্যা। ডেটা বিটের ক্রম হয়। নিম্নলিখিত ক্রিয়াকলাপগুলি উপলব্ধ বাইটে 01001101গুলিতে বিটগুলি গণনা করতে দিন: ১. আমরা শেষ বিটের মান পরীক্ষা করতে পারি। ২. আমরা ক্রমটি স্থানান্তর করতে পারি।

  1. 01001101 -> শেষ বাইট 1, মোট = 1। বদল আনতে
  2. 10100110 -> শেষ বাইট 0, মোট = 1। বদল আনতে
  3. 01010011 -> শেষ বাইট 1, মোট = 2। বদল আনতে
  4. 10101001 -> শেষ বাইট 1, মোট = 3। বদল আনতে
  5. 11010100 -> শেষ বাইট 0, মোট = 3। বদল আনতে
  6. 01101010 -> শেষ বাইট 0, মোট = 3। বদল আনতে
  7. 00110101 -> শেষ বাইট 1, মোট = 4। বদল আনতে
  8. 10011010 -> শেষ বাইট 0, মোট = 4। বদল আনতে

আমাদের উত্তর: 4।

এটা কঠিন ছিল না, তাই না? বিটওয়াইজ অপারেশনগুলির সাথে বড় কাজটি হ'ল আমরা করতে পারি এমন সীমিত জিনিস। আমরা কিছুটা সরাসরি অ্যাক্সেস করতে পারি না। তবে আমরা উদাহরণস্বরূপ, মাস্ক 00000001 এর সাথে তুলনা করে সর্বশেষ বিটের মান জানতে পারি এবং শিফট ক্রিয়াকলাপের সাথে আমরা প্রতিটি বিটকে শেষ হিসাবে তৈরি করতে পারি। অবশ্যই, ফলস্বরূপ অ্যালগরিদম অভ্যস্ত না তাদের জন্য ভীতিজনক দেখাবে। বুদ্ধি দিয়ে কিছুই করার নেই।


0

আপনি যে কাজটি করছেন তার সাথে সম্পর্কিত না হলে আমি এটির প্রয়োজন বলব না:

  • অডিও প্রক্রিয়াকরণ
  • ভিডিও প্রক্রিয়াজাতকরণ
  • গ্রাফিক্স
  • নেটওয়ার্কিং (বিশেষত যেখানে প্যাকেটের আকার গুরুত্বপূর্ণ)
  • বিপুল পরিমাণে ডেটা

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

এই অঞ্চলগুলি বাদ দিয়ে আমি কোনও বিকাশকারী / প্রবীণ বিকাশকারী কিছুটা স্থানান্তরিত করতে এবং ব্যবহার করতে পারলে এটি একটি বড় প্লাস হিসাবে গণনা করব | & এবং ^ যেহেতু এটি পেশায় আগ্রহ দেখায় যা আপনি বলতে পারেন আরও স্থিতিশীল এবং নির্ভরযোগ্য কোডের দিকে নিয়ে যায়।

যতক্ষণ না প্রথম দর্শনে পদ্ধতিটি 'না পেয়ে' যেমন উল্লেখ করা হয়েছে আপনার এটি কী করছে এবং এর কিছু পটভূমির একটি ব্যাখ্যা প্রয়োজন an আমি এটি বুদ্ধিমত্তার সাথে সম্পর্কিত বলব না তবে আপনি প্রতিদিনের ভিত্তিতে হেক্সাডেসিমালের সাথে কাজ করার এবং নির্দিষ্ট নিদর্শনগুলি সমাধান করতে পারে এমন সমস্যাগুলি সনাক্ত করার সাথে কতটা পরিচিত familiar

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