বিটওয়াইস এবং মডুলাস অপারেটরের জায়গায়


91

আমরা জানি যে উদাহরণস্বরূপ দু'জনের পাওয়ারের মডুলোটি এভাবে প্রকাশ করা যেতে পারে:

  x % 2 inpower n == x & (2 inpower n - 1).

উদাহরণ:

x % 2 == x & 1
x % 4 == x & 3
x % 8 == x & 7 

দুই সংখ্যার সাধারণ ননশক্তি সম্পর্কে কী?

চল বলি:

x% 7 ==?


8
@ নীল - মডুলো এবং বাইনারি এবং বেশ মৌলিক ক্রিয়াকলাপ, আমি অনুমান করছি যে তারা যে কোনও কম্পিউটারের ভাষায় একই রকম।
জেমস কলপ্যাক

4
পোস্ট করা ভাষা না দেখে আমি কিছুটা ক্লান্ত হয়ে পড়ি :) যদিও আমি সাধারণত অনুমান করি যে তারা যদি নির্দিষ্ট না করে তবে আমি ধারণা করি এর অর্থ সি ++ বা সি। আমি ভাবছি যে এটি কতটা সত্য ..
গ্রেট ক্লাওরন

4
যে কেউ এটি বোঝার জন্য লড়াই করছেন, তার জন্য stackoverflow.com/a/13784820/1414639 দেখুন । ওহ, এবং ভি 8 এর সাথে জেএসে আমি বিটওয়াইস অপারেটরগুলি ব্যবহার করে খুব সামান্য পারফরম্যান্সের উত্সাহ পাই ।
বারদী হার্বো

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

উত্তর:


70

প্রথমত, এটি বলা সত্য নয়

x % 2 == x & 1

সরল counterexample: x = -1। জাভা সহ অনেক ভাষায় -1 % 2 == -1। এটি হ'ল %মডুলোর প্রচলিত গাণিতিক সংজ্ঞা নয়। উদাহরণস্বরূপ জাভা একে "বাকী অপারেটর" বলে calls

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

বেস 10-তে, উদাহরণস্বরূপ, অ-নেতিবাচকদের জন্য N, N mod 10^kকেবলমাত্র সর্বনিম্ন উল্লেখযোগ্য kসংখ্যাগুলি নিচ্ছে ।

তথ্যসূত্র


4
-1 = -1 (mod 2), আপনি কী পাচ্ছেন তা নিশ্চিত নন - আপনার অর্থ এটি আইইইই 754 বাকীটির মতো নয় ?
ব্লুরাজা - ড্যানি প্লেফুঘুফুট

4
@BlueRaja জন্য -1 সাধারণ অবশিষ্টাংশ গেলিক ভাষার 2 1 en.wikipedia.org/wiki/Modular_arithmetic#Remainders
polygenelubricants

@ ব্লুরাজা: আপনি যদি নেতিবাচক সংখ্যাকে মঞ্জুর করেন তবে আপনি মূলত যা নিশ্চিত হতে পারেন (বিশেষত যেহেতু কোনও ভাষার নাম উল্লেখ করা হয়নি) তা হ'ল (a / b) / b + a % b == aসি-টাইপ অপারেটর, এ এবং বি ইন্টিজার, বি ননজারো এবং abs(a % b) < abs(b)একই প্রভিসগুলির সাথে এটিও ।
ডেভিড থর্নলে

4
@ ডেভিডথর্নলি - ধরুন আপনার অর্থ (a / b)* b + a % b == a
sfjac

40

বিটওয়াইজ ব্যবহার করে 2 ^ i সংখ্যাগুলির মডুলো সন্ধানের জন্য কেবল একটি সহজ উপায়

লিঙ্ক অনুযায়ী এন% 3, এন% 7 হিসাবে মার্সেনিন কেসগুলি সমাধান করার একটি উদ্ভাবনী উপায় রয়েছে ... এখানে এন% 5, এন% 255 এবং এন% 6 এর মতো সংমিশ্রিত কেসগুলির জন্য বিশেষ কেস রয়েছে।

ক্ষেত্রে 2 ^ i, (2, 4, 8, 16 ...)

n % 2^i = n & (2^i - 1)

আরও জটিল বিষয়গুলি ব্যাখ্যা করা শক্ত। আপনি খুব কৌতূহলী হলেই পড়ুন।


4
ভোট ++; দুর্দান্ত লিঙ্ক, রেফারেন্সের জন্য ধন্যবাদ। আমি অন্যকে একবার দেখার পরামর্শ দিই, এটি কিছুটা জটিল হলেও পড়ার পক্ষে মূল্যবান।
ভেরিজাক

লিঙ্কটি উত্তরের সেরা অংশ।
অমিত কুমার

n% 2 ^ i = n & (1 << আমি - 1)
কার্তিক সিং

18

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


4
যদি আপনি কোনও ত্রৈমাসিক আর্কিটেকচারে কাজ করে যাচ্ছেন, তবে এটি কিছুটা পরিবর্তন করে ... তবে সম্ভাবনাগুলি শূন্য।
নলডোরিন

আমি কীভাবে আপনি এটির
শব্দটি উচ্চারণ

12

এটি বিশেষত একটি বিশেষ কেস কারণ কম্পিউটারগুলি বেস 2 তে সংখ্যা উপস্থাপন করে এটি সাধারণীকরণযোগ্য:

(সংখ্যা) বেস % বেস x

(সংখ্যা) বেসের শেষ এক্স ডিজিটের সমতুল্য ।


5

2 টির ক্ষমতা ছাড়াও মডুলি রয়েছে যার জন্য দক্ষ অ্যালগরিদম বিদ্যমান।

উদাহরণস্বরূপ, x যদি 32 বিট স্বাক্ষরযুক্ত না হয় তবে x% 3 = পপসেন্ট (x এবং 0x55555555) - পপকেন্ট (x এবং 0xaaaaaaa)


4

"%" অপারেটর ছাড়াই মডুলো "7"

int a = x % 7;

int a = (x + x / 7) & 7;

4
10% 2 = 0. (10 + 10/2) এবং 2 = 15 এবং 2 = 2 এর জন্য কাজ করে না, একইভাবে 10% 6 = 4. (10 + 10/6) এবং 6 = 11 এবং 6 = 2
শ্রীরাম মুরালি

10
এছাড়াও, যখন আপনি মডুলো ব্যবহার এড়াতে চান আপনি কেন ভাগ করতে চান? আফাইক, ভাগ করার নির্দেশটি বাকীটি পাওয়ার মত একই get
ঘোড়া স্মিথ

4
@SriramMurali এখানেই কারণ আপনার অবশ্যই, একটি এমনকি গেলিক ভাষার ব্যবহার এটা কাজ করে না would, এই জন্য একটি কার্যসংক্রান্ত নেই বিজোড় মত ওপি বলেন।
ylun.ca

3

&বাইনারিতে বিটওয়াইস এবং ( ) অপারেটরটি ব্যবহার না করে, এমনটি নেই। প্রমাণের স্কেচ:

ধরা যাক এর মতো মান k ছিল x & k == x % (k + 1)তবে কে! = 2 ^ n - 1 । তারপরে যদি x == কে তবে অভিব্যক্তিটি x & k"সঠিকভাবে পরিচালনা" বলে মনে হচ্ছে এবং ফলাফলটি কে । এখন, বিবেচনা এক্স == কি যদি সেখানে কোনো "0" বিট ছিল , কিছু হয় আমি যা 0 থেকে বেশি কি কেবলমাত্র সেই অবস্থানকে 1-বিটের সাথে প্রকাশ করা হতে পারে। (উদাহরণস্বরূপ, ১০১১ (১১) অবশ্যই হতে হবে ১১১১ ()) যখন এটি থেকে ১০০ (৪) বিয়োগ করা হবে, এক্ষেত্রে 000 বিট যখন 100 = i = 4 হয় ।) যদি কে এর প্রকাশ থেকে কিছুটা শূন্য থেকে পরিবর্তন হয় এক যাও কি উপস্থাপন, তবে এটি x% (কে + 1) সঠিকভাবে গণনা করতে পারে না , যা এই ক্ষেত্রে কী হওয়া উচিত তবে বিটওয়াইজ বুলিয়ান এবং মাস্ক প্রদত্ত মানটি তৈরি করার কোনও উপায় নেই।


2

এই নির্দিষ্ট ক্ষেত্রে (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 এর চেয়ে কম দক্ষ এবং অবশ্যই কম পাঠযোগ্য।


1

বিটওয়াইজ এবং বিটওয়াইস_অর এবং বিটওয়াইস_নোট ব্যবহার করে আপনি কোনও বিট কনফিগারেশনকে অন্য বিট কনফিগারেশনে পরিবর্তন করতে পারবেন না (যেমন এই অপারেটরগুলির সেটগুলি "কার্যকরীভাবে সম্পূর্ণ")। যাইহোক, মডুলাসের মতো ক্রিয়াকলাপগুলির জন্য, সাধারণ সূত্রটি অবশ্যই জটিল হবে, আমি এটি পুনরায় তৈরি করার চেষ্টাও করি না b

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