Как заглавные и строчные буквы различаются только на один бит?

Вы можете сообщить своим пользователям добавить свой адрес «От» к своим контактам, когда они выполнит свой заказ, который, если они это сделают, поможет много.

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

Другие вещи, которые вы можете попробовать:

  • Поместите свое имя или адрес своего сайта в тему
  • . Все ссылки в сообщении, указывающие на ваш домен (а не на email.com)
  • Поместите адрес или другую контактную информацию в адрес электронной почты
13
задан s4y 23 February 2012 в 04:10
поделиться

5 ответов

Чтобы прибавить или вычесть 32, сначала нужно узнать, больше или меньше символ «А».

Когда писалась эта книга, в языках программирования, которые использовало большинство людей, не было строк или .equalsIgnoreCase. Это было до i18n, и когда у компании был сервер, вы подключались к нему через telnet (например, xterm) и получали меню командной строки. То, что он описывает, обычно использовалось для создания приятного меню без учета регистра для ваших пользователей, использующего числовое расположение таблицы ascii.

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

с = с | 32 // в верхний регистр

c = c & (1+2+4+8+16+ 0 +64+128) // в нижний регистр

Скажем, у вас есть Java-подобный язык , без объектов или стандартных библиотек. Ваш сетевой автор предлагает вам ввести такой код:

    public static void main()
    {
        println("What would you like to do?");
        println("Inventory (inv)");
        println("Reports (rep)");

        char[] ca = readUserInput();        
        for (int i = 0; i < ca.length; i++)
            ca[i] = ca[i] | 32;  // convert to uppercase, by ensuring bit 32 is set

        if (compareInput(ca, "INV") == true)
            doInventory();
    }

Вы пробовали искать в Google и иногда писать имя человека с большой буквы?

2
ответ дан 1 December 2019 в 18:04
поделиться

http://asciitable.com/

0x61 is hexadecimal for 97 = a
0x41 is hexadecimal for 65 = A

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

Z is 90 = 0b1111010    = 0x5A
z is 122 = 0b1011010   = 0x7A

Что представляет собой разницу 0b01000000 в двоичном формате или 0x20 или 32 в десятичном формате.

Таким образом, переключение 6-го бита меняет регистр.

1
ответ дан 1 December 2019 в 18:04
поделиться

посмотрите, 6-й бит = 32, поэтому, если вы перевернете его, вы вычитаете или добавляете 32

Bit value
1   1
2   2
3   4
4   8
5   16
6   32 (32 = hex 20)

Теперь если вы посмотрите здесь http://asciitable.com/, вы увидите таблицу ascii для всех символов и заметите, что A = 65 и a = 97

1
ответ дан 1 December 2019 в 18:04
поделиться

Такое соотношение между прописными и строчными буквами было преднамеренным. Когда код ASCII был сформулирован, компьютерное оборудование было примитивным, и для сохранения каждого байта требовалось программное обеспечение. Для переворота одного бита требуется очень мало оборудования или кода.

3
ответ дан 1 December 2019 в 18:04
поделиться

Давайте воспользуемся случаем, который вам покажется более знакомым: основание 10.

  1. Предположим, у нас есть компьютер с основанием 10, где каждые 10 бит хранят значение от 0 до 9, а длина 10 байт составляет 5 10 бит, так что каждый байт может хранить 100 000 значений (от 0 до 99 999).

  2. Вы хотите назначить буквы определенным позициям в 10 байтах, чтобы этот компьютер мог обмениваться текстовыми данными с другими компьютерами. Один из способов сделать это:

     00101 A 00201 a
    00102 Б 00202 Б
    00103 С 00203 С
    00104 Д 00204 Д
    00105 Э 00205 Э
    00106 Ф 00206 Ф
    00107 г 00207 г
    00108 ч 00208 ч
    00109 я 00209 я
    00110 Дж 00210 Дж
    00111 К 00211 К
    00112 л 00212 л
    00113 М 00213 М
    00114 Н 00214 Н
    00115 О 00215 О
    00116 Р 00216 Р
    00117 q 00217 q
    00118 р 00218 р
    00119 С 00219 С
    00120 т 00220 т
    00121 У 00221 У
    00122 В 00222 В
    00123 Вт 00223 Вт
    00124 х 00224 х
    00125 г 00225 г
    00126 З 00226 З
     
  3. Видите ли вы, что каждая строчная буква отличается от прописной только одной 10-битной цифрой в 3-м столбце справа? Он не должен проектироваться таким образом. Это было просто удобно, потому что каждый раз, когда мы хотим изменить регистр буквы, мы можем просто изменить одну из цифр (10 бит), не заботясь о том, что такое остальная часть числа, или возиться с двадцатью шестью различными преобразованиями, когда мы можем сделать один. Мы не могли выбрать вторую цифру, потому что вместо 100 они были бы разделены только 10 и перекрывались.

  4. Теперь в базе 2 все точно так же, но вместо того, чтобы каждый бит представлял 0-9, он может представлять только 0-1.Использование восьми 2-бит дает нам только 256 возможных комбинаций, 0-255. Коды ASCII для прописных и строчных букв в двоичном виде выглядят следующим образом:

     01000001 A 01100001 a
    01000010 Б 01100010 Б
    01000011 С 01100011 С
    01000100 Д 01100100 Д
    01000101 Э 01100101 Э
    01000110 Ф 01100110 Ф
    01000111 г 01100111 г
    01001000 ч 01101000 ч
    01001001 я 01101001 я
    01001010 Дж 01101010 Дж
    01001011 К 01101011 К
    01001100 л 01101100 л
    01001101 М 01101101 М
    01001110 Н 01101110 Н
    01001111 О 01101111 О
    01010000 Р 01110000 Р
    01010001 Q 01110001 Q
    01010010 Р 01110010 Р
    01010011 С 01110011 С
    01010100 т 01110100 т
    01010101 У 01110101 У
    01010110 В 01110110 В
    01010111 Вт 01110111 Вт
    01011000 х 01111000 х
    01011001 Г 01111001 Г
    01011010 З 01111010 З
     

    Точно так же, как и раньше, они отличаются только одной 2-битной цифрой, здесь в 6-м столбце справа. Мы не могли использовать цифру дальше вправо (меньше), потому что тогда списки перекрывались бы (2^5 = 32 и, соответственно, мы использовали все биты от 0 до 5, но 2^4 = 16, что не могло покрыть 26 букв алфавита).

  5. Просто чтобы немного дополнить информацию, вот пример того, что означают эти двоичные значения. Возьмем один для G. Чтобы понять, что означает 01000111 в двоичном формате:

      Pos: 7 6 5 4 3 2 1 0
    Бит: 0 1 0 0 0 1 1 1
    Вал: 128 64 32 16 8 4 2 1
    Мульти: 0 64 0 0 0 4 2 1
    Добавьте: 64 + 4 + 2 + 1 = 71, что является кодом ASCII для G.

    Делаем то же самое для буквы G в специальной системе с основанием 10, которую я построил выше:

      Pos: 4 3 2 1 0
    10 бит: 0 0 1 0 7
    Вал: 10000 1000 100 10 1
    Мульти: 0 0 100 0 7
    Добавьте: 100 + 7 = 107, это мой специальный код 10ASCII для G.
     

    Посмотрите на строку "Val" для двоичного кода. Видите, начиная справа, каждое значение в два раза больше предыдущего? Удваивая каждый раз, когда мы получаем 1, 2, 4, 8, 16, 32, 64, 128, 256, 512 и так далее. Вот как позиция двоичной цифры определяет ее значение, точно так же, как позиция десятичной цифры определяет ее значение со степенью 10: 1, 10, 100, 1000, 10000, 100000 и так далее.

    Я понимаю, что это выглядит глупо, потому что все, что я сделал, это преобразовал 107 в 107... но 107 — это не просто число, это сокращенная форма:

     1 сотни + 0 десятков + 7 единиц.
     

    Другим способом, которым мы могли бы представить это, является

     0 x 10 ^ 4 + 0 x 10 ^ 3 + 1 x 10 ^ 2 + 0 x 10 ^ 1 + 7 x 10 ^ 0.
     

    Точно так же 01000111 — это не просто двоичное число, это сокращенная форма для

     0 x 2^7 + 1 x 2^6 + 0 x 2^5 + 0 x 2^4 + 0 x 2 ^3 + 1 х 2 ^ 2 + 1 х 2 ^ 1 + 1 х 2 ^ 0
     

    Это то, что я вам уже показал:

     0 + 64 + 0 + 0 + 0 + 4 + 2 + 1
    = 64 + 4 + 2 + 1
    = 71
     

Кроме того, вам может быть интересно, что означают 0x41 и 0x61. Часть 0x указывает, что последующие цифры следует понимать как шестнадцатеричные, то есть с основанием 16. В нашей системе счисления всего 10 цифр, поэтому нам каким-то образом нужно еще 6 цифр. Таким образом, в шестнадцатеричном формате используются цифры 0–9, а буквы от A до F рассматриваются как оставшиеся цифры, где A – от 10 до F как 15.Шестнадцатеричный формат очень удобен для компьютеров, потому что 16 — это степень числа 2, и поэтому для кодирования 8-битного байта требуется ровно две шестнадцатеричных цифры (а каждая шестнадцатеричная цифра кодирует ровно четыре двоичных цифры). Взяв 0x41, расширив 4 до его двоичного представления 0100 и расширив 1 до его двоичного представления 0001, вы получите 01000001,который вы видите, это код для A, как показано. Чтобы преобразовать его в десятичное число, это 4 x 16 + 1 x 1 = 65. Мы умножаем 4 на 16, потому что каждая последующая шестнадцатеричная цифра слева в 16 раз больше предыдущей цифры, следуя тому же шаблону, который я показал вам выше для основания 2 и 10.

Я надеюсь, что этого достаточно, чтобы вы немного лучше поняли двоичные коды и коды ASCII.

Примечание 1: Причина использования 8 битов в байте вместо 2, как вы могли бы подумать, заключается в том, что еще на заре вычислительной техники было решено, что 8 — гораздо более полезное количество битов, т.к. 2-битный «байт» будет кодировать только 4 значения. Для передачи только прописных и строчных букв алфавита потребуется 3 байта! В двоичном коде нет ничего, что заставляло бы выбирать 8 бит на байт, за исключением того, что 8 также является степенью двойки, что упрощает большую часть математики, связанной с работой с двоичной информацией, и позволяет лучше выравнивать края. Если бы они выбрали 6 бит на байт, я уверен, что все получилось бы неловко и не удалось бы эффективно использовать весь диапазон доступных значений.

Примечание 2: Моя система пяти битов в 10 байтах основана на непрактичности использования десяти 10 битов на байт, что приводит к действительно огромному числу, которое тратит впустую много места для хранения. Я выбрал пять, потому что десять на него делится без остатка, что, несомненно, было бы полезно. (Первоначально в моем ответе использовалось десять 10 бит на 10 байт, но это было чертовски много!)

35
ответ дан 1 December 2019 в 18:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: