খুব আকর্ষণীয় প্রশ্ন, এবং চতুর কৌশল।
আসুন একক বাইট হেরফের করার একটি সাধারণ উদাহরণটি দেখুন। সরলতার জন্য স্বাক্ষরযুক্ত 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)
G
F
(d+1)
F
E
c
সুতরাং আমাদের আমাদের (এম -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
; যদি এটি কার্যকর না হয় তবে মানদণ্ড আরও একবার বাড়ান, ইত্যাদি
আমি মনে করি যে উপরের অনুসরণগুলি আপনাকে উত্তর দিয়ে দীর্ঘ পথ পাবে ...