2010-11-02 4 views
4

Как преобразовать строчный символ ASCII в верхний регистр с использованием битовой маски (не разрешено -32)?Нижний регистр в верхнем регистре

Я не прошу разрешения моей домашней работы, только некоторые намеки.

Благодаря

ответ

14

Как вы заявляете «(не разрешено -32»), я думаю, вы знаете, что разница между строчными символами и строчными буквами равна 32. Теперь преобразуем 32 в его двоичное представление, есть только один бит. После этого выработайте способ использования bit mask для переключения бит.

+1

+1 для обеспечения руководства, не отводя ферму. – alesplin

+1

Действительно, хотя, конечно, люди раздавали прямой ответ ниже: o. Я считаю, что для любых читателей следует отметить, что OP действительно указывал символы ASCII. Таким образом, этот метод или любой, представленный на этой странице, не всегда будет действительным для символов, отличных от английского Unicode (16 бит/широкий символ). Я просто хотел прояснить это. Он работал бы на английском, но не знал о других языках. Поэтому будьте осторожны и помните, что не все люди говорят по-английски, и наш Универсальный переводчик еще не изобрел; Функции CRT toupper и tolower должны использоваться для символов. –

0

Сравните шестнадцатеричные значения нижнего регистра символов ASCII в символы верхнего регистра ASCII и решение должно быть ясно. Также может быть полезно сравнить двоичные значения, если решение сразу не проявляется.

2

Просто переведите +-32 в разрядную операцию. 32 можно написать как 2^x.

4

Подумайте дифференциал между нижним и верхним кожухом (0x20), а затем применить соответствующую маску к вашему значению

XOR, чтобы получить ниже от верхнего или верхнего из нижней

+2

Или просто используйте XOR для обоих из них;) – schnaader

+1

.... исправлено .... – KevinDTimm

+0

Еще раз, если вы собираетесь бегать по голосам без голосования, объясните, почему. – KevinDTimm

0

The операции вычитания 32 из ASCII код маленькой латинской буквы переворачивает 5-й бит от 1 до 0.

+0

нет, это не влияет на один бит: 32 = 0x20 = 00100000 – KevinDTimm

+0

Вы правы, в пределах набора небольших латинских букв 5-й бит всегда один. извините, увлекшись опытом международного языка. Тогда это еще более понятно. –

-1

попытки и с 0xDF (шестнадцатеричный) или 011011111 бинарного

+1

слишком много бит .... – KevinDTimm

2

Для фактического кода, вы должны быть библиотечные функции, такие как ToUpper() или towupper(), o r что-то способное справиться со сложностью Unicode.

+1

+1, чтобы компенсировать тот, кто бегает вокруг здесь и голосует правильные ответы. –

+0

@ 9090 Так много практических проблем * * ограничено ASCII. Размахивая тростью и говоря что-то похожее на то, что «вы, черт возьми, с кем-то поглядите, что ASCII» не очень полезно. –

0

Как вы указали это, ваша домашняя работа не определена. Стандарт C ничего не знает о конкретной кодировке исходного или исполняемого набора символов, в частности, он не предполагает ничего, что приближается к ASCII или тому подобное.

Так wnoise был прав, только Стандартный способ справиться с этими вещами - это предопределенные функции и макросы, которые предусмотрены для такого эффекта.

+1

Из OP, «Как преобразовать строчный символ ASCII в верхний регистр». От «man ascii» - «ASCII - это американский стандартный код для обмена информацией. Это 7-битный код». OP не хочет стандартного способа, OP хочет преобразовать символы ASCII с нижнего регистра на верхний регистр с использованием битовой маски. Во многих случаях это простой способ облегчить людей в битмаски, поскольку они могут видеть точный эффект, который у них есть. – KevinDTimm

+0

Согласен, учитывая, что он определил ASCII в теме, он извиняется;) –

1

В этом примере предполагается, что строка находится в ASCII и используется английский алфавит.

Это код C99 C, вы должны использовать соответствующий флаг компилятора, чтобы установить это при компиляции. Я специально старался не использовать какие-либо библиотеки в этом примере, стандартные или нет, потому что я предполагаю, что вы все еще изучаете основы программирования на C.

#define UPPER_CASE_SWITCH 0x5f 
void makeUpper(unsigned char *string, int length) 
{ 
    for(char c; length != 0 && (c=*string) != 0; --length) 
     *string++ = (((c >= 'a' && c <= 'z')) ? (c & UPPER_CASE_SWITCH) : c); 
} 

Он использует тот факт, что единственная разница между верхним и нижним случае символа в таблице ASCII, является один бит. В частности, 6-й бит (справа). Все, что нам нужно сделать, это создать «маску», содержащую все 1, кроме 6-го бита (справа), а затем использовать двоичную команду AND (&), чтобы применить эту маску к наш персонаж. И тогда, конечно, поместите это в нашу строку.

Вот пример python.

>>> bin(ord("a")) ## Gets the binary digit for the letter "a" 
'0b1100001' 
>>> bin(ord("A")) ## Gets the binary digit for the letter "A" 
'0b1000001' 
>>> hex(0b1011111) ## Gets the hexadecimal mask we are using in the C source 
'0x5f' 

На мой взгляд, это самый лучший способ сделать ASCII строку (или один ASCII символ) в верхнем регистре в с.Если, конечно, вам не нужно что-то, что вернет новую строку, то вы хотите создать версию «старой» строки в верхнем регистре, но все равно сможете сохранить исходную версию где-нибудь. Это не должно быть слишком сложно сделать, если вы поймете мой первый пример. Вам просто нужно выделить новый массив, чтобы вставить строчную строку, и вернуть указатель на этот массив (unsigned char *).

Смежные вопросы