আমি সম্প্রতি সি তে এটি করার জন্য একটি ম্যাক্রো লিখেছি, তবে এটি সি ++ তে সমানভাবে বৈধ:
#define REVERSE_BYTES(...) do for(size_t REVERSE_BYTES=0; REVERSE_BYTES<sizeof(__VA_ARGS__)>>1; ++REVERSE_BYTES)\
((unsigned char*)&(__VA_ARGS__))[REVERSE_BYTES] ^= ((unsigned char*)&(__VA_ARGS__))[sizeof(__VA_ARGS__)-1-REVERSE_BYTES],\
((unsigned char*)&(__VA_ARGS__))[sizeof(__VA_ARGS__)-1-REVERSE_BYTES] ^= ((unsigned char*)&(__VA_ARGS__))[REVERSE_BYTES],\
((unsigned char*)&(__VA_ARGS__))[REVERSE_BYTES] ^= ((unsigned char*)&(__VA_ARGS__))[sizeof(__VA_ARGS__)-1-REVERSE_BYTES];\
while(0)
এটি যে কোনও ধরণের গ্রহণ করে এবং পাস আর্গুমেন্টে বাইটগুলি বিপরীত করে। ব্যবহারের উদাহরণ:
int main(){
unsigned long long x = 0xABCDEF0123456789;
printf("Before: %llX\n",x);
REVERSE_BYTES(x);
printf("After : %llX\n",x);
char c[7]="nametag";
printf("Before: %c%c%c%c%c%c%c\n",c[0],c[1],c[2],c[3],c[4],c[5],c[6]);
REVERSE_BYTES(c);
printf("After : %c%c%c%c%c%c%c\n",c[0],c[1],c[2],c[3],c[4],c[5],c[6]);
}
কোন মুদ্রণ:
Before: ABCDEF0123456789
After : 8967452301EFCDAB
Before: nametag
After : gateman
উপরেরটি নিখুঁতভাবে অনুলিপি / পেস্ট-সক্ষম, তবে এখানে অনেক কিছু চলছে, সুতরাং আমি কীভাবে এটি টুকরো টুকরো করে কাজ করব তা ভেঙে দেব:
প্রথম উল্লেখযোগ্য জিনিসটি হ'ল পুরো ম্যাক্রো একটি do while(0)
ব্লকে আবদ্ধ । ম্যাক্রোর পরে সাধারণ সেমিকোলন ব্যবহারের অনুমতি দেওয়ার জন্য এটি একটি সাধারণ প্রতিমা i
এরপরে লুপের কাউন্টার REVERSE_BYTES
হিসাবে পরিচিত একটি ভেরিয়েবলের ব্যবহার for
। ম্যাক্রোর নামটি নিজেই একটি পরিবর্তনশীল নাম হিসাবে ব্যবহৃত হয় তা নিশ্চিত করার জন্য এটি ম্যাক্রো যেখানে ব্যবহার করা হয়েছে সেখানে অন্য কোনও চিহ্নের সাথে সংঘর্ষ না ঘটায় তা নিশ্চিত হতে পারে। যেহেতু নামটি ম্যাক্রোর সম্প্রসারণের মধ্যে ব্যবহার করা হচ্ছে, এখানে পরিবর্তনশীল নাম হিসাবে ব্যবহার করার পরে এটি আর প্রসারিত হবে না।
মধ্যে for
লুপ, দুই বাইট উল্লেখ করা হচ্ছে এবং হয় XOR যাও অদলবদল (তাই একটি অস্থায়ী পরিবর্তনশীল নাম প্রয়োজন হয় না):
((unsigned char*)&(__VA_ARGS__))[REVERSE_BYTES]
((unsigned char*)&(__VA_ARGS__))[sizeof(__VA_ARGS__)-1-REVERSE_BYTES]
__VA_ARGS__
ম্যাক্রোকে যা কিছু দেওয়া হয়েছিল তা উপস্থাপন করে এবং যা পাস হতে পারে তার নমনীয়তা বাড়ানোর জন্য ব্যবহৃত হয় (তবে অনেক বেশি নয়)। এরপরে এই আর্গুমেন্টের ঠিকানাটি নেওয়া হয় এবং unsigned char
অ্যারে []
সাবস্ক্রিপশনের মাধ্যমে এর বাইটগুলি অদলবদলের অনুমতি দেওয়ার জন্য একটি পয়েন্টারে কাস্ট করা হয় ।
চূড়ান্ত অদ্ভুত পয়েন্ট হ'ল {}
বন্ধনীগুলির অভাব । এগুলি প্রয়োজনীয় নয় কারণ প্রতিটি অদলবদলের সমস্ত পদক্ষেপ কমা অপারেটরের সাথে যুক্ত হয়ে তাদের একটি বিবৃতি তৈরি করে।
পরিশেষে, এটি লক্ষণীয় যে গতি শীর্ষ অগ্রাধিকার যদি এটি আদর্শ পন্থা নয়। যদি এটি একটি গুরুত্বপূর্ণ ফ্যাক্টর হয় তবে অন্যান্য জবাবগুলিতে উল্লেখ করা টাইপ-নির্দিষ্ট ম্যাক্রোগুলি বা প্ল্যাটফর্ম-নির্দিষ্ট নির্দেশাবলীর কয়েকটি সম্ভবত একটি ভাল বিকল্প। এই পদ্ধতির তবে সমস্ত ধরণের, সমস্ত বড় প্ল্যাটফর্ম এবং সি এবং সি ++ ভাষা উভয়েরই পোর্টেবল।