Нижний регистр в верхний регистр - PullRequest
4 голосов
/ 02 ноября 2010

Как преобразовать ASCII-символ нижнего регистра в верхний регистр, используя битовую маску (без -32 допускается)?

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

Спасибо

Ответы [ 9 ]

14 голосов
/ 02 ноября 2010

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

4 голосов
/ 02 ноября 2010

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

XOR, чтобы опускаться сверху или снизу

3 голосов
/ 02 ноября 2010

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

2 голосов
/ 02 ноября 2010

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

1 голос
/ 30 ноября 2013

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

Это код C99 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) заглавной в c. Если, конечно, вам не нужно что-то, что будет возвращать новую строку, то есть вы хотите создать версию "старой" строки в верхнем регистре, но при этом будете иметь возможность где-то сохранить исходную версию. Это не должно быть слишком сложно, если вы понимаете мой первый пример. Вам просто нужно выделить новый массив для ввода строки в верхнем регистре и вернуть указатель на этот массив (без знака char *).

0 голосов
/ 02 ноября 2010

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

Так что wnoise был прав, только стандартным способом решения этих проблем являются предопределенные функции и макросы, которые предоставляются для такого эффекта.

0 голосов
/ 02 ноября 2010

попробуйте и с 0xDF (hex) или 011011111 бинарным

0 голосов
/ 02 ноября 2010

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

0 голосов
/ 02 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...