Xoring буквы алфавита с пробелом - PullRequest
20 голосов
/ 12 марта 2012

Есть ли историческая причина, почему Xoring любой буквенной буквы с пробелом меняет регистр буквы? (то есть, 'a' xor '' = 'A', 'F' xor '' = 'f' и т. д.) *

Или это просто совпадение?

(Предполагается, что символы кодируются в кодировке ASCII или Unicode.)

Ответы [ 6 ]

17 голосов
/ 12 марта 2012

Я уверен, что было преднамеренно, что случай мог быть изменен, изменяя один бит - это сделает раннее программное обеспечение намного более эффективным. Тот факт, что символ пробела # 32 не имеет значения.

10 голосов
/ 12 марта 2012

Из записи в википедии по ASCII:

Сам код был структурирован так, что большинство контрольных кодов были вместе, а все графические коды были вместе, для простоты идентификации.Первые два столбца (32 позиции) были зарезервированы для управляющих символов. [19]Символ «пробел» должен был стоять перед графикой, чтобы упростить сортировку, поэтому он стал позицией 20hex; [20] по той же причине многие специальные знаки, обычно используемые в качестве разделителей, ставились перед цифрами.Комитет решил, что важно поддерживать 64-символьные алфавиты в верхнем регистре, и решил использовать шаблон ASCII, чтобы его можно было легко сократить до 64-символьного набора графических кодов. [21]Поэтому строчные буквы не чередуются с прописными.Чтобы сохранить опции, доступные для строчных букв и другой графики, специальные и числовые коды были расположены перед буквами, и буква «А» была помещена в положение 41hex, чтобы соответствовать проекту соответствующего британского стандарта. [22]Цифры 0–9 были расположены так, чтобы они соответствовали значениям в двоичном коде с префиксом 011, что делает преобразование с двоично-десятичным десятичным кодом простым.

Так что, похоже, поведение является счастливым совпадением.

4 голосов
/ 12 марта 2012

Хорошая точка

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

На этих машинах не было активной электроники ... они использовали барабаны, двигатели и кулачки и около миллиарда металлических деталей для печати заглавных букв. У них было несколько компонентов RLC и различные реле.

Было вполне преднамеренно, что только один бит разделяет верхний и нижний регистр символов. Таким образом, системы передачи и хранения могут использовать 6 бит вместо 7.

На самом деле вам не нужен XOR, вы можете использовать ИЛИ или ДОБАВИТЬ, чтобы получить нижний регистр.

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

Вот довольно старый, восстановленный в рабочем состоянии.

1 голос
/ 12 марта 2012

Это просто особенность букв ASCII и некоторых других наборов букв, размещенных аналогичным образом. Для подавляющего большинства буквенных символов в Юникоде этого просто не происходит. Например, Ā - это U + 0100, ā - это U + 0101. Как правило, строчные и прописные буквы обычно назначаются последовательным позициям кода. И большинство буквенных символов в Unicode не имеют понятия строчные / прописные.

0 голосов
/ 04 октября 2018

В ASCII заглавные буквы представляют собой последовательные двоичные числа, начинающиеся с A = 1 0 0,0001, а строчные буквы - это последовательные двоичные числа, начинающиеся с = 1 1 0,0001. Другими словами, регистр букв можно изменить, щелкнув второй бит. Переключение второго бита эквивалентно битовому XOR с 010.0000. Это происходит в ASCII-представлении пробела.

Как уже отмечали другие, было определенно преднамеренным, что заглавные и строчные буквы различаются всего на один бит. Из этого следует, что XOR любой буквы с символом, представленным 1 в этом бите и 0 в любом другом бите, перевернет его регистр. Но маловероятно, что по этой причине символ пробела был присвоен 010.0000. Если бы для 010.0000 было бы более разумно использовать точку, или знак доллара, или цифру 0, или любой другой символ, все равно было бы так же легко перевернуть регистр буквы с помощью XOR, используя любой из этих символов. ,

(Обратите внимание, что я просто использую точки внутри двоичных чисел, чтобы сгруппировать биты, чтобы их было легче читать. Они не имеют никакого другого значения.)

0 голосов
/ 26 марта 2012

Это не совпадение, это всегда так.

   Example:  hex of 'a' = 61  hex of space = 20 XOR 'a' and space = 41 = 'A' (in hex)
   same as:  hex of 'z' = 7A  hex of space = 20 XOR 'z' and space = 5A = 'Z' (in hex)
...