নিম্ন-কেস এবং উচ্চ-বর্ণমালা বর্ণমালার ব্যাপ্তিগুলি %32
ASCII কোডিং সিস্টেমে একটি "প্রান্তিককরণ" সীমানা অতিক্রম করে না ।
এই জন্য বিট 0x20
একই অক্ষরের উপরের / লোয়ার কেস সংস্করণগুলির মধ্যে একমাত্র পার্থক্য।
যদি এটি না হয় তবে আপনাকে 0x20
কেবল টগল না করে যুক্ত করতে বা বিয়োগ করতে হবে এবং কয়েকটি চিঠির জন্য অন্যান্য উচ্চ বিটগুলি ফ্লিপ করার জন্য বহন করা উচিত। (এবং এমন কোনও একক ক্রিয়াকলাপ নেই যা টগল করতে পারে, এবং প্রথম স্থানে বর্ণমালার অক্ষরগুলির জন্য পরীক্ষা করা আরও শক্ত হবে কারণ আপনি লিসাকে জোর করাতে পারেননি = = 0x20))
সম্পর্কিত ASCII- কেবল কৌশল: আপনি ছোট হাতের অক্ষর দ্বারা জোর করে c |= 0x20
এবং তারপরে (স্বাক্ষরবিহীন) কিনা তা পরীক্ষা করে একটি বর্ণমালা ASCII চরিত্রটি পরীক্ষা করতে পারেনc - 'a' <= ('z'-'a')
। সুতরাং মাত্র 3 টি অপারেশন: অবিচ্ছিন্ন 25 এর বিরুদ্ধে OR + SUB + সিএমপি Of অবশ্যই, সংকলকরা জানেন কীভাবে আপনার (c>='a' && c<='z')
জন্য এটির মতো asm অনুকূল করা যায় , তাই বেশিরভাগ c|=0x20
অংশটি আপনার নিজেরাই করা উচিত । সমস্ত প্রয়োজনীয় কাস্টিং নিজেই করা বরং অসুবিধাজনক, বিশেষত স্বাক্ষরিত ডিফল্ট সংখ্যার প্রচারগুলি নিয়ে কাজ করা int
।
unsigned char lcase = y|0x20;
if (lcase - 'a' <= (unsigned)('z'-'a')) { // lcase-'a' will wrap for characters below 'a'
// c is alphabetic ASCII
}
// else it's not
উচ্চতর ক্ষেত্রে সি ++ তে একটি স্ট্রিং রূপান্তরও দেখুন ( toupper
কেবলমাত্র ASCII এর জন্য সিমডি স্ট্রিং , সেই চেকটি ব্যবহার করে এক্সওআরটির অপারেন্ডকে মাস্কিং করুন))
এবং এছাড়াও কীভাবে একটি চর অ্যারে অ্যাক্সেস করবেন এবং লোয়ার কেস অক্ষরগুলি বড় হাতের অক্ষরে পরিবর্তন করুন এবং বিপরীতভাবে
(সিমডি ইন্টার্নিক্স সহ সি এবং স্ক্যালার এক্স 86 এএসএম কেস-ফ্লিপগুলি অক্ষরযুক্ত ASCII অক্ষরগুলির জন্য, অন্যকে অবিস্মরণীয় রেখে দিয়ে যাবে))
এই কৌশলগুলি বেশিরভাগ ক্ষেত্রে কেবল তখন কার্যকর হয় যখন সিমড (যেমন এসএসই 2 বা নিওন) সহ কিছু পাঠ্য-প্রক্রিয়াকরণ হ্যান্ড-অপ্টিমাইজ করা হয়, যা char
ভেক্টরের যে কোনওটিরই উচ্চ বিট সেট নেই কিনা তা পরীক্ষা করে । (এবং এইভাবে কোনও একক অক্ষরের জন্য বাইটগুলির কোনওটিই মাল্টি-বাইট ইউটিএফ -8 এনকোডিংয়ের অংশ নয়, এতে বিভিন্ন উচ্চ / নিম্ন-কেস বিপরীতে থাকতে পারে)। যদি কোনওটি খুঁজে পান তবে আপনি 16 বাইটের এই অংশের জন্য বা বাকী স্ট্রিংয়ের জন্য স্ক্যালারে ফিরে যেতে পারেন।
এমন কি এমন কিছু স্থানীয় অবস্থান রয়েছে যেখানে ASCII রেঞ্জের কিছু অক্ষর toupper()
বা tolower()
বর্ণের মধ্যে এই সীমার বাইরে অক্ষর রয়েছে, উল্লেখযোগ্যভাবে তুর্কি যেখানে আমি। I এবং İ ↔ i। এই লোকেলে আপনার আরও পরিশীলিত চেক লাগবে, বা সম্ভবত এই অপ্টিমাইজেশনটি ব্যবহার করার চেষ্টা করবেন না।
তবে কিছু ক্ষেত্রে, আপনাকে ইউটিএফ -8 এর পরিবর্তে ASCII অনুমান করার অনুমতি দেওয়া হয়েছে, যেমন ইউনিক্স ইউটিলিটিগুলি LANG=C
(পসিক্স লোকেল) দিয়ে, না en_CA.UTF-8
বা যা কিছু।
তবে আপনি যদি এটি নিরাপদ যাচাই করতে পারেন তবে আপনি লুপে toupper
কল করার চেয়ে মাঝারি দৈর্ঘ্যের স্ট্রিংগুলি করতে পারবেন toupper()
(5x এর মতো) এবং সর্বশেষে আমি বুস্ট 1.5 1.5 দিয়ে পরীক্ষা করেছি , যা প্রতিটি চরিত্রের জন্য নির্বোধের চেয়ে অনেক দ্রুত ।boost::to_upper_copy<char*, std::string>()
dynamic_cast
@
ব্যবহার করে ` রূপান্তর করতে পারেন^ 32
।