একটি একক গুণ সহ বিট উত্তোলন


301

আমি একজন ব্যবহৃত একটি আকর্ষণীয় কৌশল দেখেছি উত্তর থেকে আরেকটি প্রশ্ন , এবং এটি বুঝতে কিছুটা ভালো চাই।

আমাদের একটি স্বাক্ষরবিহীন 64৪-বিট পূর্ণসংখ্যা দেওয়া হয়েছে এবং আমরা নিম্নলিখিত বিটগুলিতে আগ্রহী:

1.......2.......3.......4.......5.......6.......7.......8.......

বিশেষত, আমরা এগুলিকে শীর্ষ আট অবস্থানে নিয়ে যেতে চাই:

12345678........................................................

আমরা নির্দেশিত বিটের মান সম্পর্কে যত্ন নিই .না এবং সেগুলি সংরক্ষণ করতে হবে না।

সমাধান অবাঞ্ছিত বিট আউট মাস্ক, এবং ফলাফলের গুন ছিল 0x2040810204081। এটি, যেমন দেখা যাচ্ছে, কৌশলটি করে।

এই পদ্ধতিটি কতটা সাধারণ? এই কৌশলটি কোনও বিটের কোনও উপসেট আহরণ করতে ব্যবহার করা যেতে পারে? যদি তা না হয় তবে পদ্ধতিটি কোনও বিটের একটি নির্দিষ্ট সেটের জন্য কাজ করে কিনা বা কীভাবে তা আবিষ্কার করে?

শেষ অবধি, প্রদত্ত বিটগুলি বের করার জন্য কেউ কীভাবে (ক?) সঠিক গুণকটি আবিষ্কার করবে?


29
যদি আপনি এটি একটি আকর্ষণীয় বলে মনে করেন তবে এই তালিকাটি একবার দেখুন: গ্রাফিক্স.স্তানফোর্ড.এডু / এসেন্ডার / বিট্যাক্স.চটিএমএল তাদের মধ্যে অনেকগুলি (আব) আকর্ষণীয় ফলাফল অর্জনের জন্য একটি বৃহত্তর পূর্ণসংখ্যার গুণ / বিভাগ ব্যবহার করে use ("4 টি ক্রিয়াকলাপের সাথে একটি বাইটে বিটগুলি বিপরীত করুন" অংশটি দেখায় যে যখন আপনার কাছে পর্যাপ্ত জায়গা নেই এবং যখন দু'বার মুখোশ লাগাতে / গুণ করতে হবে) তখন কীভাবে বিটশিট / গুণক কৌশলটি মোকাবেলা করতে হবে
ভাইরাপটার

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

9
: তাই মজার ব্যাপার সেখানে AVX2 (যা দুঃখিতভাবে এখনো উপলব্ধ নয়) এ একটি নির্দেশ যে ঠিক অপারেশন আপনি বর্ণনা করে হয় software.intel.com/sites/products/documentation/studio/composer/...
JPvdMerwe

3
চতুর বিট-টুইডলিং অ্যালগোরিদমগুলির সন্ধানের জন্য আর একটি জায়গা হ'ল এমআইটি হাক্মেম
বারমার

1
উম livro কী conheço sobre ণ assunto (ঙ gosto bastante) ই o "এর হ্যাকার কল্লোল" লিংক
এর মধ্যে Salles

উত্তর:


235

খুব আকর্ষণীয় প্রশ্ন, এবং চতুর কৌশল।

আসুন একক বাইট হেরফের করার একটি সাধারণ উদাহরণটি দেখুন। সরলতার জন্য স্বাক্ষরযুক্ত 8 বিট ব্যবহার করা। আপনার নম্বরটি কল্পনা করুন xxaxxbxxএবং আপনি চান ab000000

সমাধানটি দুটি পদক্ষেপ নিয়ে গঠিত: কিছুটা মাস্কিং, তার পরে গুণফল। বিট মাস্ক হ'ল একটি সহজ এবং অপারেশন যা উদ্বেগজনক বিটগুলিকে শূন্যে পরিণত করে। উপরের ক্ষেত্রে, আপনার মুখোশটি হবে 00100100এবং ফলাফল 00a00b00

এখন শক্ত অংশ: এটি মধ্যে পরিণত ab......

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

4 ( 00000100) দ্বারা গুণনটি 2 দিয়ে বাকী সমস্ত স্থান পরিবর্তন করে আপনাকে এনে দেবে a00b0000। পেতে bউপরের দিকে নিয়ে আসতে আমরা 1 দ্বারা গুন (ডান জায়গায় রাখার) +4 (খ উপরে উঠানো পর্যন্ত) প্রয়োজন। এই যোগফলটি 5, এবং পূর্ববর্তী 4 এর সাথে মিলিত হয়ে আমরা 20 এর একটি ম্যাজিক নম্বর পেয়েছি, বা 00010100। আসলটি ছিল 00a00b00মুখোশ দেওয়ার পরে; গুণটি দেয়:

000000a00b000000
00000000a00b0000 +
----------------
000000a0ab0b0000
xxxxxxxxab......

এই পদ্ধতির থেকে আপনি আরও বড় সংখ্যা এবং আরও বিট প্রসারিত করতে পারেন।

আপনার জিজ্ঞাসিত একটি প্রশ্নের মধ্যে "এটি কি কোনও বিট দিয়ে করা যায়?" আমি মনে করি উত্তরটি "না", যদি না আপনি বেশ কয়েকটি মাস্কিং অপারেশন বা কয়েকটি গুণকে অনুমতি দেন। সমস্যাটি "সংঘর্ষের" বিষয় - উদাহরণস্বরূপ, উপরের সমস্যাটিতে "স্ট্রে বি"। ভাবুন আমাদের মতো এটির একটি সংখ্যা করা দরকার xaxxbxxcx। পূর্ববর্তী পদ্ধতির অনুসরণ করে আপনি মনে করবেন আমাদের দরকার {x 2, x {1 + 4 + 16}} = x 42 (ওওহ - সবকিছুর উত্তর!)। ফলাফল:

00000000a00b00c00
000000a00b00c0000
0000a00b00c000000
-----------------
0000a0ababcbc0c00
xxxxxxxxabc......

আপনি দেখতে পাচ্ছেন, এটি এখনও কাজ করে তবে "কেবলমাত্র"। তাদের মূল কীটি হ'ল বিটগুলির মধ্যে "পর্যাপ্ত জায়গা" রয়েছে যা আমরা চাই যে আমরা সমস্ত কিছু গ্রাস করতে পারি। আমি সি এর পরে ঠিক চতুর্থ বিট ডি যোগ করতে পারিনি, কারণ আমি যেখানে সি + ডি পাই, সেখানে বিটগুলি উপস্থিত থাকতে পারে এমন উদাহরণগুলি পেতাম ...

সুতরাং আনুষ্ঠানিক প্রমাণ ছাড়াই, আমি আপনার প্রশ্নের আরও আকর্ষণীয় অংশগুলি নিম্নরূপে উত্তর দেব: "না, এটি কোনও বিট সংখ্যার জন্য কাজ করবে না N বি বিটগুলি বের করতে আপনার যে বিটগুলি চান তার মধ্যে আপনার (এন -১) ফাঁকা স্থান প্রয়োজন need নিষ্কাশন করুন, বা অতিরিক্ত মাস্ক-গুণিত পদক্ষেপ রয়েছে। "

বিটগুলির মধ্যে "অবশ্যই থাকতে হবে (এন -১) জিরো" র ক্ষেত্রে কেবলমাত্র ব্যতিক্রমটিই আমি ভাবতে পারি এটি হ'ল: আপনি যদি একে অপরের সাথে সংলগ্ন দুটি বিট মূলতে বের করতে চান এবং আপনি সেগুলিতে রাখতে চান একই আদেশ, তারপর আপনি এখনও এটি করতে পারেন। এবং (এন -১) বিধিটির উদ্দেশ্যে তারা দুটি বিট হিসাবে গণনা করে।

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

a...e.b...d..c..

মধ্যে স্থানান্তরিত করা যেতে পারে

abcde...........

যদিও ই এবং খ এর মধ্যে একটি মাত্র স্থান রয়েছে, ডি এবং সি এর মধ্যে দুটি, অপরের মাঝে তিনটি। এন -১ এর সাথে যা ঘটেছে ?? এই ক্ষেত্রে, a...e"একটি ব্লক" হয়ে যায় - এগুলি সঠিক জায়গায় শেষ করতে 1 দ্বারা গুণিত হয় এবং সুতরাং "আমরা বিনামূল্যে ই পেয়েছি"। বি এবং ডি এর জন্য একই (খ এর ডানদিকে তিনটি স্পেস প্রয়োজন, ডিটির বামে একই তিনটি প্রয়োজন)। সুতরাং যখন আমরা যাদু নম্বরটি গণনা করি তখন আমরা দেখতে পাই যে সদৃশগুলি রয়েছে:

a: << 0  ( x 1    )
b: << 5  ( x 32   )
c: << 11 ( x 2048 )
d: << 5  ( x 32   )  !! duplicate
e: << 0  ( x 1    )  !! duplicate

স্পষ্টতই, আপনি যদি এই সংখ্যাগুলি একটি অন্য ক্রমে চান তবে আপনার সেগুলি আরও ফাঁকা রাখতে হবে। আমরা বিধিটিকে সংস্কার করতে পারি (N-1): "বিটগুলির মধ্যে কমপক্ষে (এন -1) ফাঁকা থাকলে এটি সর্বদা কাজ করবে; বা, যদি চূড়ান্ত ফলাফলের বিটের ক্রমটি জানা যায়, তবে যদি বি বি এর অবস্থান এমতে থাকে তবে n, এর বাম দিকে মি -1 জিরো এবং ডানদিকে এনএম জিরো থাকা দরকার।

@ টার্নারি উল্লেখ করেছেন যে এই বিধিটি বেশ কার্যকরভাবে কাজ করে না, কারণ "লক্ষ্যমাত্রার ডানদিকে" কেবল বিট যোগ হতে পারে - যথা, যখন আমরা যে বিটগুলি সন্ধান করি তারা সবগুলিই হয়। উদাহরণটি অবিরত করে আমি 16 টি বিট শব্দে পাঁচটি দৃ pack় প্যাক বিট সহ উপরে দিয়েছি: যদি আমরা শুরু করি

a...e.b...d..c..

সরলতার জন্য, আমি বিট পজিশনের নাম দেব ABCDEFGHIJKLMNOP

আমরা যে গণিত করতে যাচ্ছিলাম তা ছিল

ABCDEFGHIJKLMNOP

a000e0b000d00c00
0b000d00c0000000
000d00c000000000
00c0000000000000 +
----------------
abcded(b+c)0c0d00c00

এখন অবধি, আমরা ভেবেছিলাম নীচে কিছু abcde(পজিশন ABCDE) এতে কিছু আসে যায় না, তবে বাস্তবে, @ টার্নারি বলেছে যে, যদি অবস্থানের b=1, c=1, d=1পরে কিছুটা অবস্থানের দিকে নিয়ে যায় , যার অর্থ অবস্থানটি কিছুটা নিয়ে যাবে - এবং আমাদের ফলাফল নষ্ট হয়। নোট করুন যে স্বল্পতম লক্ষণীয় আগ্রহের ডানদিকে স্থান ( এই উদাহরণস্বরূপ) কিছু যায় আসে না, যেহেতু গুণটি বিয়োন থেকে জিরোগুলির সাথে কমপক্ষে উল্লেখযোগ্য বিট তৈরি করে।(b+c)GF(d+1)FEc

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

আমাদের কেবল (এনএম) মাপদণ্ডের সাথে মিলিত বিটের সংখ্যাটিই নয়, (এন-এম + 1) ইত্যাদিতেও ইত্যাদি দেখতে হবে। আসুন তাদের সংখ্যাটি Q0 ( n-mপরের বিটের ঠিক ঠিক ), Q1 ( এন-এম + 1), কিউ (এন -1) (এন -1) পর্যন্ত। তাহলে আমরা যদি বহন ঝুঁকিপূর্ণ

Q0 > 1
Q0 == 1 && Q1 >= 2
Q0 == 0 && Q1 >= 4
Q0 == 1 && Q1 > 1 && Q2 >=2
... 

আপনি যদি এটি তাকান, আপনি দেখতে পাচ্ছেন যে আপনি যদি একটি সাধারণ গাণিতিক এক্সপ্রেশন লিখেন

W = N * Q0 + (N - 1) * Q1 + ... + Q(N-1)

এবং ফলাফলটি হল W > 2 * N, তারপরে আপনাকে আরএইচএসের মানদণ্ডকে এক বিট করে বাড়িয়ে তুলতে হবে (n-m+1)। এই মুহুর্তে, অপারেশনটি যতক্ষণ নিরাপদ থাকে W < 4; যদি এটি কার্যকর না হয় তবে মানদণ্ড আরও একবার বাড়ান, ইত্যাদি

আমি মনে করি যে উপরের অনুসরণগুলি আপনাকে উত্তর দিয়ে দীর্ঘ পথ পাবে ...


1
গ্রেট। আরও একটি সূক্ষ্ম সমস্যা: এম -1 / এনএম পরীক্ষা ক্যারি-বিটের কারণে কিছু সময় ব্যর্থ হয়। ব্যবহার করে দেখুন একটি ... b..c ... ঘ - আপনি পঞ্চম বিট যা যদি তারা উভয় 1 বহন বিট যে clobbers ঘ তোলে সঙ্গে B + গ গুটান (!)
তিন

1
আপশট: এন -1 স্পেসের বিটগুলি এমন কনফিগারেশনগুলিকে নিষিদ্ধ করে যা কাজ করা উচিত (iea ... b..c ... d), এবং এম -1 / এনএম যেগুলি কাজ করে না (a ... b..c) ... ঘ)। কোনটি কাজ করবে এবং কোনটি হবে না তা চিহ্নিত করার জন্য আমি একটি সহজ উপায় নিয়ে আসতে সক্ষম হইনি।
টার্নারি

তুমি ভাল! বহন সমস্যাটির অর্থ হ'ল "সুরক্ষা" হিসাবে প্রতিটি বিটের ডানদিকে আমাদের আরও কিছুটা জায়গা প্রয়োজন। প্রথম নজরে, যদি কমপক্ষে দুটি বিট থাকে যা ডানদিকে সর্বনিম্ন এনএম থাকে তবে আপনার স্পেসটি 1 দ্বারা বাড়িয়ে নিতে হবে আরও সাধারণভাবে, যদি এই ধরণের বিট থাকে তবে আপনার লগ 2 (পি) এর অতিরিক্ত বিটগুলি দরকার সর্বনিম্ন (এমএন) থাকা যে কোনওটির ডান। ঠিক মনে হচ্ছে?
ফ্লোরিস

ভাল যে শেষ মন্তব্য খুব সরল ছিল। আমি মনে করি আমার সর্বাধিক সম্পাদিত উত্তরগুলি দেখায় যে লগ 2 (পি) সঠিক পদ্ধতির নয়। @ টার্নারির নিজস্ব উত্তর (নীচে) মার্জিতভাবে দেখায় যে আপনার যদি কোনও গ্যারান্টিযুক্ত সমাধান না থাকে তবে আপনি কীভাবে একটি নির্দিষ্ট বিট সংমিশ্রণের জন্য বলতে পারেন - আমি বিশ্বাস করি যে উপরের কাজটি আরও কিছুটি বিশদভাবে বর্ণনা করেছে।
ফ্লোরিস

1
এটি সম্ভবত একটি কাকতালীয় ঘটনা, তবে এই উত্তরটি গৃহীত হয়েছিল যখন উপসংহারের সংখ্যা 127 পৌঁছেছিল। আপনি যদি এখন পর্যন্ত এটি পড়ে থাকেন তবে আপনি আমার সাথে হাসবেন ...
ফ্লোরিস

154

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

"এখানে কিছু 64৪-বিট ধ্রুবক 'মাস্ক' এবং 'গুণক' রয়েছে যা সমস্ত 64৪-বিট বিটভেক্টর এক্স এর জন্য y = (x ও মুখোশ) * গুণিতক, আমাদের কাছে সেই y.63 == x.63 , y.62 == x.55, y.61 == x.47, ইত্যাদি। "

যদি এই বাক্যটি আসলে উপপাদ্য হয়, তবে এটি সত্য যে ধ্রুবকগুলির 'মুখোশ' এবং 'গুণক' এর কিছু মান এই সম্পত্তিটিকে সন্তুষ্ট করে। সুতরাং এর একটি প্রপঞ্চ প্রবাদটি বুঝতে পারে এমন কোনও শর্তে এই শব্দটি বাক্যটি যাক, এসএমটি-এলআইবি 2 ইনপুট:

(set-logic BV)

(declare-const mask         (_ BitVec 64))
(declare-const multiplicand (_ BitVec 64))

(assert
  (forall ((x (_ BitVec 64)))
    (let ((y (bvmul (bvand mask x) multiplicand)))
      (and
        (= ((_ extract 63 63) x) ((_ extract 63 63) y))
        (= ((_ extract 55 55) x) ((_ extract 62 62) y))
        (= ((_ extract 47 47) x) ((_ extract 61 61) y))
        (= ((_ extract 39 39) x) ((_ extract 60 60) y))
        (= ((_ extract 31 31) x) ((_ extract 59 59) y))
        (= ((_ extract 23 23) x) ((_ extract 58 58) y))
        (= ((_ extract 15 15) x) ((_ extract 57 57) y))
        (= ((_ extract  7  7) x) ((_ extract 56 56) y))
      )
    )
  )
)

(check-sat)
(get-model)

এবং এখন আসুন উপপাদ্য প্রবাদটি জেড 3 কে জিজ্ঞাসা করুন এটি কোনও উপপাদ্য কিনা:

z3.exe /m /smt2 ExtractBitsThroughAndWithMultiplication.smt2

ফলাফল হলো:

sat
(model
  (define-fun mask () (_ BitVec 64)
    #x8080808080808080)
  (define-fun multiplicand () (_ BitVec 64)
    #x0002040810204081)
)

বিঙ্গো! এটি 0.06 সেকেন্ডের মধ্যে মূল পোস্টে দেওয়া ফলাফল পুনরুত্পাদন করে।

এটিকে আরও সাধারণ দৃষ্টিকোণ থেকে দেখে আমরা এটিকে প্রথম-অর্ডার প্রোগ্রাম সংশ্লেষণ সমস্যার উদাহরণ হিসাবে দেখতে পারি, যা গবেষণার একটি নবজাতক অঞ্চল যা সম্পর্কে কয়েকটি প্রবন্ধ প্রকাশিত হয়েছে। আপনার জন্য অনুসন্ধান "program synthesis" filetype:pdfশুরু করা উচিত।


2
আমি মুগ্ধ! আমি জানতাম না যে "বিটভেেক্টর তত্ত্বের উপর ফার্স্ট-অর্ডার যুক্তি" এমনকি এমন একটি বাস্তব বিষয় যা লোকেরা পড়াশুনা করেছিল - একা ছেড়ে দেওয়া যাক এটি এমন আকর্ষণীয় ফলাফল দিতে পারে। এই ভাগ করে নেওয়ার জন্য অনেক ধন্যবাদ।
ফ্লোরিস

@ অ্যান্ড্রুব্যাকার: এই তথাকথিত "এসও-অ্যাস-এ-জব" জিনিসে কোন বক্তব্য আছে তাতে কেউ আমাকে আলোকিত করতে পারে? আমি বলতে চাচ্ছি, এটা না দিতে কিছু। আপনি একা এসও প্রতিনিধিতে বাঁচতে পারবেন না। হতে পারে এটি আপনাকে সাক্ষাত্কারে কিছু পয়েন্ট দিতে পারে। হতে পারে. কর্মক্ষেত্র যদি এসও প্রতিনিধিটির মান সনাক্ত করতে যথেষ্ট ভাল হয়, এবং এটি কোনও প্রদত্ত না হয় ...
মনিকা

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

88

গুণকটির প্রতিটি 1-বিট বিটগুলির একটিকে তার সঠিক অবস্থানে অনুলিপি করতে ব্যবহৃত হয়:

  • 1ইতিমধ্যে সঠিক অবস্থানে রয়েছে, তাই দ্বারা গুণাও 0x0000000000000001
  • 2অবশ্যই 7 বিট অবস্থানগুলি বামে স্থানান্তরিত করতে হবে, তাই আমরা গুণ করব 0x0000000000000080(বিট 7 সেট করা হয়েছে)।
  • 314 বিট অবস্থান অবশ্যই বামে স্থানান্তরিত করতে হবে, তাই আমরা গুন করব 0x0000000000000400(বিট 14 সেট করা হয়েছে)।
  • এবং তাই পর্যন্ত
  • 849 বিট অবস্থানগুলি অবশ্যই বামে স্থানান্তরিত করতে হবে, তাই আমরা গুণ করব 0x0002000000000000(বিট 49 সেট করা আছে)।

গুণক পৃথক বিটের জন্য গুণকগুলির যোগফল।

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

মনে রাখবেন যে মূল সংখ্যাটিতে অন্যান্য বিটগুলি অবশ্যই হবে 0। এটি একটি AND অপারেশনে তাদের মাস্কিং দ্বারা অর্জন করা যেতে পারে।


2
দুর্দান্ত ব্যাখ্যা! আপনার সংক্ষিপ্ত উত্তরটি "ম্যাজিক নম্বর" এর মান দ্রুত খুঁজে পাওয়া সম্ভব করেছে।
এক্সপিডো

4
এটি সত্যই সেরা উত্তর, তবে @ ফ্লরিসের উত্তরটির প্রথমার্ধটি (প্রথমার্ধ) না পড়লে এটি এতটা সহায়ক হত না।
অ্যান্ড্রু ব্যাকার

29

(আমি এটি আগে কখনও দেখিনি। এই কৌশলটি দুর্দান্ত!)

ফ্লোরিসের এই দৃ on় প্রতিবেদনে আমি কিছুটা প্রসারিত করব যে nবিটগুলি বের n-1করার সময় আপনার কোনও অনাবৃত বিটগুলির মধ্যে স্থান প্রয়োজন :

আমার প্রাথমিক চিন্তা (আমরা এটি এক মিনিটে দেখব যে এটি কীভাবে কার্যকর হয় না) এটি ছিল আপনি আরও ভাল করতে পারেন: আপনি যদি nবিটগুলি বের করতে চান iতবে আপনার যদি কেউ থাকে তবে বিট উত্তোলন / শিফট করার সময় আপনার একটি সংঘর্ষ হবে ( বিট পূর্ববর্তী বা পরে বিট বিট i) ।i-1n-i

আমি উদাহরণের জন্য কয়েকটি উদাহরণ দেব:

...a..b...c...কাজ করে (2 বিটের পরে কেউ নয় a, কিছুটা আগে এবং কিছুটা পরে b, এবং কেউ আগে 2 বিটে নেই c):

  a00b000c
+ 0b000c00
+ 00c00000
= abc.....

...a.b....c...ব্যর্থ হয় কারণ b2 বিটের পরে থাকে a(এবং যখন আমরা স্থানান্তরিত করি তখন অন্য কারও স্পটে টানা হয় a):

  a0b0000c
+ 0b0000c0
+ 00c00000
= abX.....

...a...b.c...ব্যর্থ হয় কারণ bপূর্ববর্তী 2 বিটগুলিতে থাকে c(এবং আমরা যখন অন্য স্থানের স্থানান্তরিত হয় তখন অন্য কারও জায়গায় intoুকে যায় c):

  a000b0c0
+ 0b0c0000
+ b0c00000
= Xbc.....

...a...bc...d... ক্রমাগত বিট একসাথে শিফট করার কারণে কাজ করে:

  a000bc000d
+ 0bc000d000
+ 000d000000
= abcd000000

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

...a...b..c...d...বহন-বিট সম্ভাব্য ব্যর্থতা, cহয় n-1পরে b, কিন্তু সন্তুষ্ট n-iমানদণ্ড:

  a000b00c000d
+ 0b00c000d000
+ 00c000d00000
+ 000d00000000
= abcdX.......

তাহলে আমরা কেন সেই " n-1স্পেসের বিট" প্রয়োজনে ফিরে যাব না ? কারণ আমরা আরও ভাল করতে পারি :

...a....b..c...d.. " n-1স্পেসের বিট" পরীক্ষায় ব্যর্থ হয় , তবে আমাদের বিট-এক্সট্র্যাক্টিং ট্রিকের জন্য কাজ করে:

+ a0000b00c000d00
+ 0b00c000d000000
+ 00c000d00000000
+ 000d00000000000
= abcd...0X......

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

(-1 AND mask) * shiftপ্রত্যাশিত সকলের ফলাফলের সাথে তুলনা করুন -1 << (64-n)(64৪-বিট স্বাক্ষরযুক্ত নয়)

আমাদের বিটগুলি উত্তোলনের জন্য ম্যাজিক শিফট / গুনে কাজ করে এবং কেবল যদি দুটি সমান হয়।


আমি এটি পছন্দ করি - আপনি ঠিক বলেছেন যে প্রতিটি বিটের জন্য আপনার ডানদিকে কেবলমাত্র অনেকগুলি শূন্য প্রয়োজন কারণ আপনাকে সেখানে যেতে হবে এমন বিটগুলির জন্য জায়গা প্রয়োজন। এছাড়াও , এটির বামে যতগুলি বিট প্রয়োজন যেমন এটির বামে ফলাফল-বিট রয়েছে। তাই একটু যদি bঅবস্থানে শেষ পর্যন্ত mএর n, তাহলে এটি প্রয়োজন আছে m-1তার বাম দিকে শূন্য, এবং n-m-1তার ডান দিকে শূন্য। বিশেষত যখন বিটগুলি মূল সংখ্যায় একই ক্রমে না থাকে যেমন তারা পুনরায় অর্ডার দেওয়ার পরে থাকবে, এটি মূল মানদণ্ডে একটি গুরুত্বপূর্ণ উন্নতি। এটা মজা.
ফ্লোরিস ২

13

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

অনেক কম্পিউটার দাবা ইঞ্জিন বিভিন্ন piece৪-বিট পূর্ণসংখ্যা ব্যবহার করে (বিটবোর্ডস নামে পরিচিত) বিভিন্ন টুকরা সেট (অধিষ্ঠিত বর্গক্ষেত্রে 1 বিট) উপস্থাপন করতে। ধরুন কোনও নির্দিষ্ট উত্স স্কোয়ারের একটি স্লাইডিং টুকরা (রুক, বিশপ, কুইন) Kকোনও ব্লকিং টুকরা না থাকলে বেশিরভাগ স্কোয়ারে যেতে পারে । Kদখলকৃত স্কোয়ারের বিটবোর্ডের সাথে বিটওয়াইস এবং সেই বিক্ষিপ্ত বিটগুলির ব্যবহার করে Kএকটি 64-বিট পূর্ণসংখ্যার মধ্যে এমবেড করা একটি নির্দিষ্ট- বিট শব্দ দেয় ।

Scattered৪- বিট পূর্ণসংখ্যার Kনিম্ন Kবিটগুলিতে এই বিক্ষিপ্ত বিটগুলি ম্যাপ করার জন্য যাদু গুন ব্যবহার করা যেতে পারে । এই নিম্ন Kবিটগুলি তারপরে প্রাক-গণিত বিটবোর্ডগুলির একটি সারণী সূচী করে ব্যবহার করা যেতে পারে যা অনুমোদিত বর্গক্ষেত্রের প্রতিনিধিত্ব করে যা এর উত্স বর্গক্ষেত্রের টুকরোগুলি আসলে স্থানান্তর করতে পারে (ব্লকিং টুকরো ইত্যাদির যত্ন নেওয়া))

এই পদ্ধতির ব্যবহার করে একটি সাধারণ দাবা ইঞ্জিনে 2 টি টেবিল রয়েছে (একটি ছদ্মবেশীর জন্য একটি, বিশপের জন্য একটি, রানী উভয়ের সংমিশ্রণ ব্যবহার করে) 64 টি এন্ট্রি (উত্স বর্গক্ষেত্রের জন্য একটি) যেমন প্রাক-গণিত ফলাফল রয়েছে। উভয়ই সর্বোচ্চ রেটেড বদ্ধ উত্স ( হাউদিনী ) এবং ওপেন সোর্স দাবা ইঞ্জিন ( স্টকফিশ ) বর্তমানে এর উচ্চতর কর্মক্ষমতা জন্য এই পদ্ধতির ব্যবহার করে।

এই ম্যাজিক মাল্টিপ্লায়ারগুলি সন্ধান করা হয় একটি বিস্তৃত অনুসন্ধান (প্রারম্ভিক কাট অফগুলির সাথে অনুকূলিতকরণ) বা ট্রায়াল এবং ইরারারের মাধ্যমে (যেমন প্রচুর এলোমেলো 64৪ -বিট পূর্ণসংখ্যার চেষ্টা করে ) ব্যবহার করে সম্পন্ন হয় । মুভ জেনারেশনের সময় এমন কোনও বিট নিদর্শন ব্যবহার করা হয়নি যার জন্য কোনও ম্যাজিক ধ্রুবক খুঁজে পাওয়া যায়নি। যাইহোক, বিটওয়াইজ ক্যারি এফেক্টগুলি সাধারণত যখন ম্যাপযুক্ত বিটগুলিতে (প্রায়) সংলগ্ন সূচক থাকে তখন প্রয়োজনীয় হয়।

আফাইক, @ সাইজির খুব সাধারণ স্যাট-সলভার পদ্ধতির কম্পিউটার দাবাতে ব্যবহৃত হয়নি, এবং এই জাতীয় যাদুবিদ্যার অস্তিত্ব এবং অদ্বিতীয়তার বিষয়ে কোনও আনুষ্ঠানিক তত্ত্বও দেখা যায় না।


আমি ভেবেছিলাম যে যার পুরোপুরি বিকাশযুক্ত আনুষ্ঠানিক সিএস ব্যাকগ্রাউন্ড রয়েছে তারা এই সমস্যাটি দেখে সরাসরি স্যাট পদ্ধতির উপর ঝাঁপিয়ে পড়েছিল। সম্ভবত সিএস লোকেরা দাবা উদ্দীপনা খুঁজে পাবে? :(
মনিকা পুনরায় ইনস্টল করুন

@ কুবা ওবার এটি প্রায়শই অন্যান্য উপায়ে: কম্পিউটার দাবাতে বিট-ট্যুইডলারের দ্বারা প্রভাবিত হয় যারা সি বা অ্যাসেমব্লিতে প্রোগ্রাম করে এবং কোনও ধরণের বিমূর্ততা ঘৃণা করে (সি ++, টেম্পলেট, ওও)। আমি মনে করি বন্ধ বাস্তব সি এস বলছি :-) যে ভয় পাই
TemplateRex
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.