Неизвестный ASCII
Знаете ли вы:
- чтобы из символа десятичной цифры получить ее численное значение, достаточно взять младшие 4 бита ASCII-кода этой цифры;
- чтобы получить порядковый номер буквы латинского алфавита (неважно, в верхнем или нижнем регистре), достаточно взять младшие 5 бит ASCII-кода этой буквы;
- чтобы перевести латинскую букву из нижнего регистра в верхний, достаточно установить 6-й бит (со смещением 5) ASCII-представления буквы в 1 (обратная операция выполняется по аналогии, сбросом этого бита).
Первые два факта я не знал.


Как бы http://typedef.ru/2009/09/c-joy/
Ты меня прям ставишь в тупик своей немногословностью =) Скажи по секрету, что ты имел в виду?
Смахивает на те же трюки с языком. Если бы в коде я такую битовую арифметику встретил и не было бы рядом комментария, я бы долго ругался неприличными словами.
Битовые трюки обычно используются на самом нижнем уровне, заботливо укутанные километрами абстракций =)
Вообще, такие штуки стоит применять только если производительность просто мегакритична. Например, в нашей ОС это было бы уместно в обработчике прерывания. В остальных случаях эта копеечная экономия никому не нужна.
а кто знал про все три факта, тот наверняка на асме програмил :)
Ассемблеру такая обфускация и не снилась! Вот, с учетом (1), преобразование строки в число:
int atoi(const char *a) { int _=0;for(;*a&&(_*=10,_+=*a++&017););return _; }Возьмите меня на IOCCC!
И почему я под шарп ничего подобного не видел? …
Да, я иногда зануда =)
Потому что я на шарпе такого не писал =) «You can write FORTRAN in any language» (c)
Вот, специально для шарперов:
int atoi(const char *a) { int i; for(i = 0; *a != '\0'; a++) { i *= 10; i += (*a)&0x0F; } return i; }Прям как в институте =)
Да я больше про IOCCC имел ввиду.
Одно его существование символизирует.
С в этом плане просто младенец по сравнению с Perl. Там подобный стиль в обычном коде сплошь и рядом.