^ = 32 এর পিছনে কী ধারণা রয়েছে যা ছোট হাতের অক্ষরকে উপরের এবং বিপরীতে রূপান্তর করে?


146

আমি কোডফোর্সে কিছু সমস্যা সমাধান করছিলাম। সাধারণত আমি প্রথমে যাচাই করি অক্ষরটি উচ্চতর বা নিম্ন ইংরেজি বর্ণের হয় কিনা তারপরে বিয়োগ বা 32সংশ্লিষ্ট বর্ণটিতে রূপান্তর করতে যোগ করুন । তবে আমি একজনকে ^= 32একই জিনিস করতে করতে পেয়েছি । এটা এখানে:

char foo = 'a';
foo ^= 32;
char bar = 'A';
bar ^= 32;
cout << foo << ' ' << bar << '\n'; // foo is A, and bar is a

আমি এর জন্য একটি ব্যাখ্যা অনুসন্ধান করেছি এবং খুঁজে পাইনি। তাহলে কেন এটি কাজ করে?


5
en.wikedia.org/wiki/File:USASCII_code_chart.png টিপ: আপনি @ব্যবহার করে ` রূপান্তর করতে পারেন ^ 32
কামিলকুক

112
FWIW, এটি আসলে "কাজ" করে না really এটি এই নির্দিষ্ট চরিত্রের সেটটির জন্য কাজ করে তবে অন্যান্য সেট রয়েছে যেখানে এটি আপনার ব্যবহার করা উচিত নয় toupperএবং tolowerকেসগুলি স্যুইচ করতে হবে।
নাথান অলিভার

7
অনলাইন প্রতিযোগিতাগুলির সাথে একসময় "ধারণাটি" কোডটি এমন একটি বিভ্রান্ত উপায়ে লিখতে হয় যে এটি কখনই কোনও গুরুতর পর্যালোচনা পাস না;)
idclev 463035818

21
OR = এক্সওআর ব্যবহার করে মানটিকে রূপান্তর করছে। আপারকেস এএসসিআইআই বর্ণগুলি সংশ্লিষ্ট বিটে একটি শূন্য থাকে, তবে ছোট হাতের অক্ষরগুলির একটি থাকে। বলেছিল, প্লিজ না! লোয়ারকেস এবং বড় হাতের মধ্যে রূপান্তর করতে যথাযথ অক্ষর (ইউনিকোড) রুটিন ব্যবহার করুন। সবেমাত্র ASCII এর যুগ অনেক দীর্ঘ।
হান্স-মার্টিন মোসনার

14
এটি কেবল কিছু চরিত্রের সেটগুলির সাথেই কাজ করে না। এমনকি যদি আমরা ধরে নিই যে সমস্ত বিশ্ব ইউটিএফ -8 (যা কমপক্ষে একটি সুন্দর ইউটোপিয়ান লক্ষ্য হতে পারে), এটি কেবলমাত্র 26 টি অক্ষরের সাথেও কাজ Aকরে Z। যতক্ষণ না আপনি কেবল ইংরেজী সম্পর্কে নজর রাখেন (এবং "ন্যাভ", "ক্যাফে" এর মতো শব্দ, বা ডায়াক্রিটিক্সের নামগুলি ব্যবহার করেন না ...) তবে পৃথিবীটি কেবল ইংরেজী নয়।
ilkkachu

উত্তর:


149

বাইনারি এএসসিআইআই কোড সারণীতে একবার দেখে নেওয়া যাক।

A 1000001    a 1100001
B 1000010    b 1100010
C 1000011    c 1100011
...
Z 1011010    z 1111010

এবং 32 হ'ল 0100000ছোট এবং বড় হাতের অক্ষরের মধ্যে একমাত্র পার্থক্য difference সুতরাং বিট টগলিং একটি চিঠির ক্ষেত্রে টগল করে।


49
শুধুমাত্র হওয়া ASCII জন্য * "যদি টগল"
গরুর হাঁসের

39
@ এএসসিআইআই-তে কেবল এ-জা-জেড-এর জন্য জবাব দেওয়া হচ্ছে। নিচু কর ক্ষেত্রে "[" হয় না "{"।
dbkk

21
@dbkk এর {চেয়ে সংক্ষিপ্ত [, সুতরাং এটি একটি "নিম্ন" কেস। কোন? ঠিক আছে, আমি নিজেকে প্রকাশ করব: ডি
পিটার বদিদা

25
তুচ্ছ বস্তু খোশগল্প: 7 বিট এলাকায়, জার্মান কম্পিউটারের ছিল [] {|} ÄÖÜäöü যেহেতু আমরা Umlauts সেই বেশী অক্ষর প্রয়োজন, যাতে প্রেক্ষাপটে remapped, {(ক) আসলে ছিল ছোট হাতের [(ক)।
গুন্ট্রাম ব্লহম মনিকাকে

14
@GuntramBlohm আরও ট্রিভিয়ার খোশগল্প, এই কারণেই আইআরসি সার্ভার বিবেচনা foobar[] এবং foobar{}অভিন্ন ডাকনাম হতে, যেমন ডাকনাম ক্ষেত্রে হয় অবশ , এবং আইআরসি স্ক্যান্ডিনেভিয়ার মধ্যে নিহিত :)
ZeroKnight

117

এএসসিআইআই মানগুলি সত্যিকারের স্মার্ট লোকেরা বেছে নিয়েছে তার চেয়ে এটি সত্য ব্যবহার করে।

foo ^= 32;

এই 6 ষ্ঠ সর্বনিম্ন বিট ফ্লিপ 1 এর foo(এর হওয়া ASCII সাজানোর বড়হাতের পতাকা), একটি ছোট হাতের এবং একটি ASCII বড় হাতের অক্ষরে রূপান্তর ভাইস বিপরীতভাবে

+---+------------+------------+
|   | Upper case | Lower case |  32 is 00100000
+---+------------+------------+
| A | 01000001   | 01100001   |
| B | 01000010   | 01100010   |
|            ...              |
| Z | 01011010   | 01111010   |
+---+------------+------------+

উদাহরণ

'A' ^ 32

    01000001 'A'
XOR 00100000 32
------------
    01100001 'a'

এবং এক্সওর এর সম্পত্তি দ্বারা 'a' ^ 32 == 'A',।

বিজ্ঞপ্তি

সি ++ টি অক্ষরের প্রতিনিধিত্ব করতে ASCII ব্যবহার করার প্রয়োজন হয় না। আর একটি বৈকল্পিক হ'ল ইবিসিডিক । এই কৌশলটি কেবল ASCII প্ল্যাটফর্মগুলিতে কাজ করে। আরো পোর্টেবল সমাধান ব্যবহার করতে হবে std::tolowerএবং std::toupper, প্রদত্ত বোনাস সহ স্থানীয়ের সচেতন হতে (এটা স্বয়ংক্রিয়ভাবেই আপনার আপনার সব সমস্যার সমাধান করে না যদিও, মন্তব্য দেখতে):

bool case_incensitive_equal(char lhs, char rhs)
{
    return std::tolower(lhs, std::locale{}) == std::tolower(rhs, std::locale{}); // std::locale{} optional, enable locale-awarness
}

assert(case_incensitive_equal('A', 'a'));

1) 32 হ'ল 1 << 5(2 পাওয়ার থেকে 5), এটি ষষ্ঠ বিটকে ফ্লিপ করে (1 থেকে গণনা করা)।


16
ইবিসিডিককে খুব স্মার্ট ব্যক্তিরাও বেছে নিয়েছিলেন: খোঁচা কার্ড সিএফ-তে সত্যই কাজ করে। এএসসিআইআই যা একটি গণ্ডগোল। তবে এটি একটি দুর্দান্ত উত্তর, +1।
বাথশেবা

65
আমি পাঞ্চ কার্ড সম্পর্কে জানি না, তবে ASCII কাগজের টেপটিতে ব্যবহৃত হয়েছিল । এ কারণেই মুছুন অক্ষরটি 1111111 হিসাবে এনকোড করা আছে: সুতরাং আপনি টেপের সমস্ত কলামের ছিদ্র ছুঁড়ে দিয়ে কোনও অক্ষরকে "মুছে ফেলা" হিসাবে চিহ্নিত করতে পারেন।
dan04

23
@ বাথশেবা এমন কেউ হিসাবে যিনি কোনও পঞ্চকার্ড ব্যবহার করেননি, ইবিসিডিক বুদ্ধিমানভাবে ডিজাইন করা হয়েছিল এই ধারণাটি নিয়ে আমার মাথাটি জড়িয়ে রাখা খুব কঠিন।
লর্ড ফারকোয়াড

9
@ লর্ডফারাকোয়াড আইএমএইচও উইকিপিডিয়া চিত্রটি কীভাবে একটি পঞ্চকার্ডে অক্ষরগুলি লেখা হয় তা এই এনকোডিংয়ের জন্য কীভাবে EBCDIC কিছু (তবে মোট নয়, দেখুন / বনাম এস) বোঝায় তার একটি স্পষ্ট চিত্র ration en.wikipedia.org/wiki/EBCDIC#/media/...
Peteris

11
@ dan04 "'MASSE' এর নিম্ন-আকারের ফর্মটি কী?" উল্লেখ করার জন্য দ্রষ্টব্য। যারা জানেন না তাদের জন্য জার্মান ভাষায় দুটি শব্দ রয়েছে যার বড় হাতের ফর্মটি MASSE; একটি হ'ল "মাসি" এবং অন্যটি "মায়ে"। tolowerজার্মান ভাষায় যথাযথভাবে কেবল একটি অভিধানের প্রয়োজন হয় না, এটি অর্থ বিশ্লেষণ করতে সক্ষম হওয়া প্রয়োজন।
মার্টিন বোনার

35

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

প্রায় ৩০-৩৫ বছর আগে হ্যাকটি যুক্তিযুক্ত "ঠিক আছে" ছিল যখন কম্পিউটার প্রকৃতপক্ষে ASCII তে ইংরাজী ছাড়া আর সম্ভবত দুটি বা দুটি ইউরোপীয় ভাষায় করতে পারে না languages কিন্তু ... আর তাই না।

হ্যাকটি কাজ করে কারণ ইউএস-লাতিন আপার- এবং লোয়ারকেসগুলি 0x20একে অপর থেকে একেবারে পৃথক এবং একই ক্রমে উপস্থিত হয়, যা কেবলমাত্র এক বিট পার্থক্য। যা, বাস্তবে, এই বিট হ্যাক, টগল করে।

এখন, পশ্চিম ইউরোপের জন্য কোড পৃষ্ঠা তৈরির লোকেরা এবং পরে ইউনিকোড কনসোর্টিয়ামগুলি, এই পরিকল্পনাটি জার্মান উমালটস এবং ফরাসি-উচ্চারণযুক্ত স্বরগুলির জন্য রাখতে যথেষ্ট স্মার্ট ছিল। So যার জন্য নয় (যতক্ষণ না কেউ 2017 সালে ইউনিকোড কনসোর্টিয়ামকে বোঝায়, এবং একটি বিশাল ফেক নিউজ প্রিন্ট ম্যাগাজিন এটি সম্পর্কে লিখেছিল, ডুডেনকে সত্যই বোঝায় - এ সম্পর্কে কোনও মন্তব্য নেই) এমনকি একটি ভার্সাল হিসাবে উপস্থিত নেই (এসএসে রূপান্তর) । এখন এটা নেই যেমন versal অস্তিত্ব, কিন্তু দুটি 0x1DBFঅবস্থানের পৃথক্ না 0x20

প্রয়োগকারীরা ছিল, কিন্তু, না সহানুভূতিশীল যথেষ্ট এই বর্তা। উদাহরণস্বরূপ, আপনি যদি কিছু পূর্ব ইউরোপীয় ভাষায় বা হ্যাক প্রয়োগ করে থাকেন (যেমন আমি সিরিলিক সম্পর্কে জানতাম না) তবে আপনি একটি বাজে আশ্চর্য হবেন। সমস্ত "হ্যাচেট" চরিত্রগুলি এর উদাহরণ, ছোট হাতের অক্ষর এবং বড় হাতের অক্ষর আলাদা। হ্যাক এভাবে সঠিকভাবে কাজ করে না

আরও অনেক বিষয় বিবেচনা করার আছে, উদাহরণস্বরূপ, কিছু অক্ষর কেবল নিম্ন থেকে বড় হাতের কাছে মোটেও রূপান্তরিত হয় না (তাদের বিভিন্ন সিকোয়েন্সগুলি প্রতিস্থাপন করা হয়), বা তারা ফর্ম পরিবর্তন করতে পারে (বিভিন্ন কোড পয়েন্টের প্রয়োজন হয়)।

এমনকি এই হ্যাক থাই বা চাইনিজের মতো স্টাফগুলিতে কী করবে সে সম্পর্কেও ভাববেন না (এটি আপনাকে সম্পূর্ণ বকাবকি দেবে)।

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


2
আমি সম্পূর্ণরূপে একমত - যদিও প্রতিটি প্রোগ্রামার এটি কেন কাজ করে তা জেনে রাখা ভাল ধারণা - এমনকি একটি ভাল সাক্ষাত্কারের প্রশ্নও তৈরি করতে পারে .. এটি কী করে এবং কখন এটি ব্যবহার করা উচিত :)
বিল কে

33

এটি কাজ করে কারণ এটি যেমন ঘটে থাকে তেমনি ASCII এ 'আ' এবং 'এ' এবং প্রাপ্ত এনকোডিংগুলির মধ্যে পার্থক্য 32, এবং 32 এছাড়াও ষষ্ঠ বিটের মান। একচেটিয়া OR এর সাথে 6th ষ্ঠ বিট উল্টানো উপরের এবং নিম্নের মধ্যে রূপান্তর করে।


22

সম্ভবত আপনার অক্ষর সেট বাস্তবায়ন হবে ASCII। যদি আমরা টেবিলটি তাকান:

এখানে চিত্র বর্ণনা লিখুন

আমরা দেখতে পাচ্ছি যে 32ছোট হাতের এবং বড় হাতের সংখ্যার মানের মধ্যে ঠিক পার্থক্য রয়েছে। অতএব, যদি আমরা করি ^= 32(যা least ষ্ঠ সর্বনিম্ন তাৎপর্যপূর্ণ বিট টগল করার সমান হয়), তবে এটি একটি ছোট হাতের এবং বড় হাতের অক্ষরের মধ্যে পরিবর্তিত হয়।

মনে রাখবেন যে এটি কেবলমাত্র অক্ষর নয়, সমস্ত প্রতীক নিয়ে কাজ করে। এটি character ষ্ঠ বিট আলাদা হওয়ার সাথে সম্পর্কিত চরিত্রের সাথে একটি অক্ষর টগল করে, এর ফলে এক জোড়া অক্ষর তৈরি হয় যা সামনে এবং সামনে টগল করা হয়। অক্ষরগুলির জন্য, সংশ্লিষ্ট উপরের / ছোট হাতের অক্ষরগুলি এমন একটি জুড়ি তৈরি করে। এ NULরূপান্তরিত হবে Spaceএবং অন্যান্য উপায়ে চলে যাবে এবং @ব্যাকটিকটির সাথে টগল হয়। মূলত এই চার্টের প্রথম কলামের যে কোনও অক্ষর অক্ষরের সাথে এক কলামে টগল হয় এবং এটি তৃতীয় এবং চতুর্থ কলামগুলিতে প্রযোজ্য।

যদিও আমি এই হ্যাকটি ব্যবহার করব না, কারণ এটি কোনও সিস্টেমে কাজ করবে কিনা তার কোনও গ্যারান্টি নেই। শুধু ব্যবহার এর toupper এবং tolower পরিবর্তে, এবং যেমন জিজ্ঞাস্য isupper


2
ঠিক আছে, এটি 32 অক্ষরের পার্থক্যযুক্ত সমস্ত অক্ষরের জন্য কাজ করে না Otherwise অন্যথায় এটি '@' এবং '' এর মধ্যে কাজ করবে!
ম্যাথিউ ব্রুচার

2
@ ম্যাথিউ ব্রুচার এটি কাজ করছে, 32 ^ 320 নয়, 64 নয়
নাথান অলিভার

5
'@' এবং '' 'অক্ষর' নয়। কেবলমাত্র [a-z]এবং [A-Z]"অক্ষর"। বাকিগুলি একই নিয়ম অনুসরণ করে এমন কাকতালীয় ঘটনা। যদি কেউ আপনাকে "আপার কেস]" জিজ্ঞাসা করে তবে তা কী হবে? এটি এখনও "]" হতে পারে - "" "" "" এর "আপার কেস" নয়।
ফ্রিডেন-এম

4
@ ম্যাথিউউব্রুচার: এই দৃষ্টিকোণটি করার আরেকটি উপায় হ'ল নিম্ন-কেস এবং উচ্চ-বর্ণের বর্ণমালার রেখাগুলি ASCI %32কোডিং সিস্টেমে একটি "প্রান্তিককরণ" সীমানা অতিক্রম করে না । এই কারণেই বিট 0x20একই অক্ষরের উপরের / লোয়ার কেস সংস্করণগুলির মধ্যে একমাত্র পার্থক্য। যদি এটি না হয় তবে আপনাকে 0x20কেবল টগল না করে যুক্ত করতে বা বিয়োগ করতে হবে এবং কয়েকটি চিঠির জন্য অন্যান্য উচ্চতর বিটগুলি ফ্লিপ করার জন্য বহন করা উচিত। (এবং একই ক্রিয়াকলাপটি টগল করতে পারেনি, এবং প্রথম স্থানে বর্ণমালার অক্ষরগুলির জন্য পরীক্ষা করা আরও শক্ত হবে কারণ আপনি |= 0x20লেসকে জোর করতে পারবেন না ))
পিটার

2
শেষের সঠিক গ্রাফিক (এবং বর্ধিত ASCII সংস্করণ !!) এ তাকানোর জন্য asciitable.com এ সেই সমস্ত দর্শন আমাকে স্মরণ করিয়ে দেওয়ার জন্য +1, আমি জানি না, 15 বা 20 বছর?
এসি

15

এখানে প্রচুর ভাল উত্তর যা এটি কীভাবে কাজ করে তা বর্ণনা করে তবে কেন এটি এইভাবে কাজ করে তা হল কর্মক্ষমতা উন্নত করা। প্রসেসরের মধ্যে বিটওয়াইজ অপারেশনগুলি অন্যান্য অপারেশনগুলির চেয়ে দ্রুত faster আপনি যে বিটটি কেস নির্ধারণ করে বা কেসটিকে উপরের / নিম্নে পরিবর্তিত করে কেবল বিটটি উল্টিয়ে (কেবলমাত্র সেই ASCII টেবিলটি ডিজাইন করেছেন তারা খুব স্মার্ট ছিলেন) না দেখে আপনি একটি কেস সংবেদনশীল তুলনা দ্রুত করতে পারেন।

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

https://en.wikipedia.org/wiki/Bitwise_operation

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

দ্রষ্টব্য: আমি বিভিন্ন কারণে স্ট্রিংয়ের সাথে কাজ করার জন্য স্ট্যান্ডার্ড লাইব্রেরিগুলি ব্যবহার করার সুপারিশ করব (পাঠযোগ্যতা, নির্ভুলতা, বহনযোগ্যতা ইত্যাদি)। আপনি যদি পারফরম্যান্স পরিমাপ করে থাকেন তবে বিট ফ্লিপিং ব্যবহার করুন এবং এটি আপনার সমস্যা।


14

এটি ASCII কীভাবে কাজ করে, এটাই সব।

তবে এটির ব্যবহারের ক্ষেত্রে, আপনি বহনযোগ্যতা ছেড়ে দিচ্ছেন যেহেতু সি ++ এনকোডিং হিসাবে ASCII তে জোর দেয় না।

এই কারণেই ফাংশনগুলি std::toupperএবং std::tolowerসি ++ স্ট্যান্ডার্ড লাইব্রেরিতে প্রয়োগ করা হয় - আপনার পরিবর্তে সেগুলি ব্যবহার করা উচিত।


6
যদিও প্রোটোকল রয়েছে, যার জন্য ডিএসএসের মতো ASCII ব্যবহার করা দরকার। আসলে, "0x20 ট্রিক" কিছু ডিএনএস সার্ভার একটি ডিএনএস কোয়েরিতে একটি বিরোধী-স্পোফিং প্রক্রিয়া হিসাবে অতিরিক্ত এনট্রপি toোকাতে ব্যবহার করে। ডিএনএস কেস সংবেদনশীল, তবে এটি কেস সংরক্ষণেরও বলে মনে করা হয়, তাই যদি এলোমেলো কেস সহ কোনও জিজ্ঞাসা প্রেরণ করা হয় এবং একই কেসটি ফিরে পাওয়া যায় তবে এটি একটি ভাল ইঙ্গিত যে কোনও তৃতীয় পক্ষের প্রতিক্রিয়া ছাঁটাই হয়নি।
Alnitak

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

5
@ ক্যাপ্টেনম্যান: একেবারে। ইউটিএফ -8 নিছক সৌন্দর্যের জিনিস। আশা করা যায় যে এটি ভাসমান পয়েন্টের জন্য আইইইই 7575 এর সি ++ স্ট্যান্ডার্ড ইনসোফারে "শোষিত" হয়ে যায়।
বাথশেবা

11

দ্বিতীয় টেবিলটি http://www.catb.org/esr/faqs/things-every-hacker-once-knew/#_ascii এ দেখুন এবং নীচের নোটগুলি নীচে পুনরুত্পাদন করেছেন:

আপনার কীবোর্ডের নিয়ন্ত্রণ মোডিফায়ারটি মূলত আপনি যে কোনও চরিত্র টাইপ করুন তার শীর্ষ তিনটি বিট সাফ করে নীচে পাঁচটি রেখে ম্যাপিং 0..31 রেঞ্জে রাখুন। সুতরাং, উদাহরণস্বরূপ, Ctrl-SPACE, Ctrl- @, এবং Ctrl-`এর অর্থ একই জিনিস: NUL।

খুব পুরানো কীবোর্ডগুলি কী বা উপর নির্ভর করে কেবল 32 বা 16 বিট টগল করে শিফট করত; এ কারণেই ASCII এ ছোট এবং মূল অক্ষরের মধ্যে সম্পর্ক এতটা নিয়মিত এবং সংখ্যা এবং চিহ্ন এবং কিছু সংকেতের চিহ্নের মধ্যে সম্পর্কটি যদি আপনি এটিকে বাদ দেন তবে নিয়মিত হয়। এএসআর -৩৩, যা একটি সর্বদাই বড় আকারের টার্মিনাল ছিল, এমনকি আপনাকে কিছু বিরামচিহ্ন তৈরি করতে দেয় যার জন্য এটিতে কী নেই যা ১ bit বিট স্থানান্তরিত করে; সুতরাং, উদাহরণস্বরূপ, শিফট-কে (0x4 বি) হয়ে উঠেছে [(0x5B)

হওয়া ASCII যেমন পরিকল্পনা করা হয়েছিল যে shiftctrlকীবোর্ড কী অনেক (অথবা হয়ত জন্য কোনো ছাড়া বাস্তবায়িত করা যায়নি ctrl) যুক্তিবিজ্ঞান - shiftসম্ভবত মাত্র কয়েক গেটস প্রয়োজন। এটি অন্য কোনও অক্ষরের এনকোডিংয়ের মতো তারের প্রোটোকলটি সংরক্ষণ করার জন্য কমপক্ষে যথাযথ ধারণা তৈরি করেছে (কোনও সফ্টওয়্যার রূপান্তর প্রয়োজন নেই)।

লিঙ্ক নিবন্ধ এছাড়াও অনেক অদ্ভুত হ্যাকার নিয়মাবলী যেমন ব্যাখ্যা করে And control H does a single character and is an old^H^H^H^H^H classic joke.( এখানে পাওয়া )।


1
ASCII ডাব্লু / এর বেশিগুলির জন্য একটি শিফট টগল বাস্তবায়ন করতে পারে foo ^= (foo & 0x60) == 0x20 ? 0x10 : 0x20, যদিও এটি কেবল ASCII এবং তাই অন্যান্য উত্তরে বর্ণিত কারণে বুদ্ধিমান। এটি সম্ভবত ডাব্লু / শাখা-মুক্ত প্রোগ্রামিংও উন্নত করা যেতে পারে।
আইরিডেইন

1
আহ, foo ^= 0x20 >> !(foo & 0x40)সহজ হবে। এছাড়াও কেন সংক্ষিপ্ত কোডটি প্রায়শই অপঠনযোগ্য considered _ ^ হিসাবে বিবেচিত হয় ^
আইরিডইন

8

বাইনারি 32 (00100000) দিয়ে জোরিং ষষ্ঠ বিট (ডান দিক থেকে) সেট করে বা পুনরায় সেট করে। এটি 32 যোগ বা বিয়োগের সাথে কঠোর সমান।


2
এটির আর একটি উপায় যা XOR হ'ল অ্যাড-ক্যারি।
পিটার

7

নিম্ন-কেস এবং উচ্চ-বর্ণমালা বর্ণমালার ব্যাপ্তিগুলি %32ASCII কোডিং সিস্টেমে একটি "প্রান্তিককরণ" সীমানা অতিক্রম করে না ।

এই জন্য বিট 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

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