আমরা জানি যে উদাহরণস্বরূপ দু'জনের পাওয়ারের মডুলোটি এভাবে প্রকাশ করা যেতে পারে:
x % 2 inpower n == x & (2 inpower n - 1).
উদাহরণ:
x % 2 == x & 1
x % 4 == x & 3
x % 8 == x & 7
দুই সংখ্যার সাধারণ ননশক্তি সম্পর্কে কী?
চল বলি:
x% 7 ==?
আমরা জানি যে উদাহরণস্বরূপ দু'জনের পাওয়ারের মডুলোটি এভাবে প্রকাশ করা যেতে পারে:
x % 2 inpower n == x & (2 inpower n - 1).
উদাহরণ:
x % 2 == x & 1
x % 4 == x & 3
x % 8 == x & 7
দুই সংখ্যার সাধারণ ননশক্তি সম্পর্কে কী?
চল বলি:
x% 7 ==?
উত্তর:
প্রথমত, এটি বলা সত্য নয়
x % 2 == x & 1
সরল counterexample: x = -1। জাভা সহ অনেক ভাষায় -1 % 2 == -1। এটি হ'ল %মডুলোর প্রচলিত গাণিতিক সংজ্ঞা নয়। উদাহরণস্বরূপ জাভা একে "বাকী অপারেটর" বলে calls
বিটওয়াইজ অপ্টিমাইজেশনের ক্ষেত্রে, কেবলমাত্র দুটির মডিউল পাওয়ার বিটওয়াইথ গাণিতিকগুলিতে "সহজেই" করা যায়। সাধারণভাবে বলতে গেলে, বেস একমাত্র মডিউল ক্ষমতা খ "সহজে" বেস সঙ্গে কাজ করা যেতে পারে খ সংখ্যার উপস্থাপনা।
বেস 10-তে, উদাহরণস্বরূপ, অ-নেতিবাচকদের জন্য N, N mod 10^kকেবলমাত্র সর্বনিম্ন উল্লেখযোগ্য kসংখ্যাগুলি নিচ্ছে ।
-1 = -1 (mod 2), আপনি কী পাচ্ছেন তা নিশ্চিত নন - আপনার অর্থ এটি আইইইই 754 বাকীটির মতো নয় ?
(a / b) / b + a % b == aসি-টাইপ অপারেটর, এ এবং বি ইন্টিজার, বি ননজারো এবং abs(a % b) < abs(b)একই প্রভিসগুলির সাথে এটিও ।
(a / b)* b + a % b == a।
বিটওয়াইজ ব্যবহার করে 2 ^ i সংখ্যাগুলির মডুলো সন্ধানের জন্য কেবল একটি সহজ উপায় ।
লিঙ্ক অনুযায়ী এন% 3, এন% 7 হিসাবে মার্সেনিন কেসগুলি সমাধান করার একটি উদ্ভাবনী উপায় রয়েছে ... এখানে এন% 5, এন% 255 এবং এন% 6 এর মতো সংমিশ্রিত কেসগুলির জন্য বিশেষ কেস রয়েছে।
ক্ষেত্রে 2 ^ i, (2, 4, 8, 16 ...)
n % 2^i = n & (2^i - 1)
আরও জটিল বিষয়গুলি ব্যাখ্যা করা শক্ত। আপনি খুব কৌতূহলী হলেই পড়ুন।
এটি কেবলমাত্র দুটি (এবং প্রায়শই কেবল ধনাত্মক) এর ক্ষমতার জন্য কাজ করে কারণ তাদের বাইনারি উপস্থাপনায় কেবলমাত্র 1 বিট সেট করার অনন্য সম্পত্তি রয়েছে। যেহেতু অন্য কোনও শ্রেণির সংখ্যা এই সম্পত্তিটি ভাগ করে না, আপনি বেশিরভাগ মডুলাস এক্সপ্রেশনগুলির জন্য বিটওয়াইজ এবং এক্সপ্রেশন তৈরি করতে পারবেন না।
2 টির ক্ষমতা ছাড়াও মডুলি রয়েছে যার জন্য দক্ষ অ্যালগরিদম বিদ্যমান।
উদাহরণস্বরূপ, x যদি 32 বিট স্বাক্ষরযুক্ত না হয় তবে x% 3 = পপসেন্ট (x এবং 0x55555555) - পপকেন্ট (x এবং 0xaaaaaaa)
"%" অপারেটর ছাড়াই মডুলো "7"
int a = x % 7;
int a = (x + x / 7) & 7;
&বাইনারিতে বিটওয়াইস এবং ( ) অপারেটরটি ব্যবহার না করে, এমনটি নেই। প্রমাণের স্কেচ:
ধরা যাক এর মতো মান k ছিল x & k == x % (k + 1)তবে কে! = 2 ^ n - 1 । তারপরে যদি x == কে তবে অভিব্যক্তিটি x & k"সঠিকভাবে পরিচালনা" বলে মনে হচ্ছে এবং ফলাফলটি কে । এখন, বিবেচনা এক্স == কি যদি সেখানে কোনো "0" বিট ছিল ট , কিছু হয় আমি যা 0 থেকে বেশি কি কেবলমাত্র সেই অবস্থানকে 1-বিটের সাথে প্রকাশ করা হতে পারে। (উদাহরণস্বরূপ, ১০১১ (১১) অবশ্যই হতে হবে ১১১১ ()) যখন এটি থেকে ১০০ (৪) বিয়োগ করা হবে, এক্ষেত্রে 000 বিট যখন 100 = i = 4 হয় ।) যদি কে এর প্রকাশ থেকে কিছুটা শূন্য থেকে পরিবর্তন হয় এক যাও কি উপস্থাপন, তবে এটি x% (কে + 1) সঠিকভাবে গণনা করতে পারে না , যা এই ক্ষেত্রে কী হওয়া উচিত তবে বিটওয়াইজ বুলিয়ান এবং মাস্ক প্রদত্ত মানটি তৈরি করার কোনও উপায় নেই।
এই নির্দিষ্ট ক্ষেত্রে (7 মড), আমরা এখনও বিটওয়াইড অপারেটরগুলির সাথে% 7 প্রতিস্থাপন করতে পারি:
// Return X%7 for X >= 0.
int mod7(int x)
{
while (x > 7) x = (x&7) + (x>>3);
return (x == 7)?0:x;
}
এটি কাজ করে কারণ 8% 7 = 1. স্পষ্টতই, এই কোডটি সম্ভবত কোনও সাধারণ x% 7 এর চেয়ে কম দক্ষ এবং অবশ্যই কম পাঠযোগ্য।
বিটওয়াইজ এবং বিটওয়াইস_অর এবং বিটওয়াইস_নোট ব্যবহার করে আপনি কোনও বিট কনফিগারেশনকে অন্য বিট কনফিগারেশনে পরিবর্তন করতে পারবেন না (যেমন এই অপারেটরগুলির সেটগুলি "কার্যকরীভাবে সম্পূর্ণ")। যাইহোক, মডুলাসের মতো ক্রিয়াকলাপগুলির জন্য, সাধারণ সূত্রটি অবশ্যই জটিল হবে, আমি এটি পুনরায় তৈরি করার চেষ্টাও করি না b