Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Всё ли приходит с опытом? 
:(
    Опции темы
Riddik
Дата 27.6.2009, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 2.12.2006

Репутация: нет
Всего: нет



Привет.
Есть такие вещи, которые до сих пор меня в ступор ставят.

Вот пример:
Код

ubyte val = 0x99; 
udword num = ((val & 0xF0) >> 4) * 10 + (val & 0x0F);


Кое-где увидел, как мельком взглянув на такой код, программист сказал, "будет 99"

Скажите, это действительно должно быть так просто? Лично для меня нет пока.

И ещё. 
Стандарт ведь не говорит, что делает такой код:
Код

int i = 0;
i = ++i + ++i;


Разные компиляторы скомпилируют по-разному. VC++ 2008 - 4. gcc - 3.

Или
Код

int v[2], k = 0;
v[k] = k++;


Вопрос: что делать, чтобы не теряться в таких ситуациях и чётко всё видеть и чувствовать. 
Если читать книги, то какие? Не во всех освещены такие моменты?

P.S. Знаю, что это всё неформально зовётся "г-о-в-н--о-кодом" и в реальных проектах не применяется, но на собеседованиях обычно этим и заваливают по отзывам очевидцев.


Это сообщение отредактировал(а) Riddik - 27.6.2009, 01:28
PM MAIL   Вверх
mes
Дата 27.6.2009, 01:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Riddik @  27.6.2009,  00:25 Найти цитируемый пост)
Скажите, это действительно должно быть так просто? Лично для меня нет пока.

Просто было бы, если бы был опыт работы с битовыми операциями над шестнадцатиричными цифрами.
& 0xF  и >> 4 для 16ричных грубо говоря такие же простые операции как /10 и %10 для 10ричных smile

Добавлено через 1 минуту и 38 секунд
Цитата(Riddik @  27.6.2009,  00:25 Найти цитируемый пост)

Вопрос: что делать, чтобы не теряться в таких ситуациях и чётко всё видеть и чувствовать. 

учиться, учиться и учиться ! © В.И.Ленин smile


--------------------
PM MAIL WWW   Вверх
Andrew121
Дата 27.6.2009, 02:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 21.6.2009

Репутация: 1
Всего: 1



Меня тож битовые операции подвешивают smile 
PM MAIL   Вверх
zkv
Дата 27.6.2009, 07:25 (ссылка)   | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 92



Цитата(Riddik @  27.6.2009,  01:25 Найти цитируемый пост)
ubyte val = 0x99; 
udword num = ((val & 0xF0) >> 4) * 10 + (val & 0x0F);

Riddik, надо учитывать, в каком проекте присутствовал подобный код, какие условия были. В общем случае я назову его нечитабельным - код несостоятельный (опять так - зависит от задачи). 


Это сообщение отредактировал(а) zkv - 27.6.2009, 14:20
PM MAIL   Вверх
baldina
Дата 27.6.2009, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата

программист сказал, "будет 99"

не ему счет поручают, когда электричества нет?  smile 

Riddik, с опытом что-то придет, безусловно. ты ведь в принципе можешь понять выражение. а на лету или нет - вопрос практики. 
и прочие ситуации - то же самое. придет. придет и понимание, что мастерство не в лихо закрученных выражениях, а в читабельном коде, который лет через 10 будет читать понятно и приятно.
PM MAIL   Вверх
Irdis
Дата 27.6.2009, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 21.5.2008

Репутация: нет
Всего: 1



Код

ubyte val = 0x99; 
udword num = ((val & 0xF0) >> 4) * 10 + (val & 0x0F);

Заняло 3 минуты (так делать нечего было)
Перепишем в двоичной
val=10011001
------------
10011001 &
11110000 =
10010000 >>4=
00001001 ~ 9
9*10=90

10011001 &
00001111=
00001001 ~9

9+90=99
========
Теперь я супер программист smile 

Это сообщение отредактировал(а) Irdis - 27.6.2009, 13:24
PM MAIL   Вверх
Irdis
Дата 27.6.2009, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 21.5.2008

Репутация: нет
Всего: 1



Поясню в чём секрет мастерства
Перевод из 16ричной системы в двоичную
0->0000
1->0001
2->0010
...
8->1000
...
A->1010
B->1011
...
F->1111
Допустим число F81 легко перевести с помощью простой подстановки из приведенной таблицы 1111 1000 0001 (обратная операция равносильна) (кстати в восьмеричной всё аналогично, за исключением рассматриваем таблицу до 7 и числа 000 001 010)
теперь & ну и |
1 &(|) 1 = 1 (1)
1 &(|) 0 = 0 (1)
0 &(|) 1 = 0 (1)
0 &(|) 0 = 0 (0)
1110111000011 &
1111100000000=
1110100000000 (смотри на столбцы)
>> x  просто сдвиг вправо на x бит
====================
ш++ или ++ш
o=i++; //(могу ошибаться) сначала идёт присваивание а потом(!после! всех операции) увеличение на единицу значения i
o=++i // сначала(!до! всех операций) увеличение на единицу значения i, а потом присваивание 
пс gcc - шлак видимо разработчики не читали Страуструпа smile 

Это сообщение отредактировал(а) Irdis - 27.6.2009, 14:25
PM MAIL   Вверх
zim22
Дата 27.6.2009, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Riddik @  27.6.2009,  01:25 Найти цитируемый пост)
Кое-где увидел, как мельком взглянув на такой код, программист сказал, "будет 99"

никому не говорите: в вверхней строчке был ответ smile

Цитата(Riddik @  27.6.2009,  01:25 Найти цитируемый пост)

Код

ubyte val = 0x99; 
udword num = ((val & 0xF0) >> 4) * 10 + (val & 0x0F);


***
Цитата(Riddik @  27.6.2009,  01:25 Найти цитируемый пост)
но на собеседованиях обычно этим и заваливают по отзывам очевидцев.

не соглашусь. обычно заваливают, если кандидат слишком высокого о себе мнения, а на самом деле ничего не знает smile

Это сообщение отредактировал(а) zim22 - 27.6.2009, 13:56


--------------------
PM MAIL   Вверх
Riddik
Дата 27.6.2009, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 2.12.2006

Репутация: нет
Всего: нет



Интересно  smile 

PM MAIL   Вверх
mes
Дата 27.6.2009, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(zim22 @  27.6.2009,  12:51 Найти цитируемый пост)

никому не говорите: в вверхней строчке был ответ smile

А разве 0x99 и 99 это одно и то же ?




--------------------
PM MAIL WWW   Вверх
Andrew121
Дата 27.6.2009, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 21.6.2009

Репутация: 1
Всего: 1



Irdis, Твои посты нужно в вики вывесить!
PM MAIL   Вверх
mes
Дата 27.6.2009, 14:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Irdis @  27.6.2009,  12:24 Найти цитируемый пост)
Заняло 3 минуты (так делать нечего было)

 В битовое представление переводить в данном случае не обязательно, можно решить гораздо проще :
(хотя чтоб знать как применять операции сразу к 16 ричным цифрам нужен опыт, о котором говорилось выше smile )
Код


// & 0xF0  - сохраняем левую 16ричную цифру, 
0x99 & 0xF0 = 0х90

// >> 4 - сдвигаем вправо на одну 16ричную позицию
0х90 >> 4 = 0x09 

// & 0x0F - сохраняем правую 16ричную цифру
0x99 & 0x0F = 0х09

0x09*10+0x09 = 9*10+9 =99



Цитата(Irdis @  27.6.2009,  12:45 Найти цитируемый пост)
o=i++; //(могу ошибаться) сначала идёт присваивание а потом(!после! всех операции) увеличение на единицу значения i
o=++i // сначала(!до! всех операций) увеличение на единицу значения i, а потом присваивание 
пс gcc - шлак видимо разработчики не читали Страуструп

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



Это сообщение отредактировал(а) mes - 27.6.2009, 15:17


--------------------
PM MAIL WWW   Вверх
zim22
Дата 27.6.2009, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(mes @  27.6.2009,  14:44 Найти цитируемый пост)
А разве 0x99 и 99 это одно и то же ?

smile попробуйте поподставлять значения в диапазоне от нуля до 99
Код

unsigned char val = 0x13; 



--------------------
PM MAIL   Вверх
mes
Дата 27.6.2009, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(zim22 @  27.6.2009,  14:19 Найти цитируемый пост)
smile попробуйте поподставлять значения в диапазоне от нуля до 99

Вы о том что что если вместо 0х99 подставить 0х13 то получится 13 вместо 99 ?
Но во первых это не отменяет вопрос Ridder`a, о том как человек сходу догадался, что из 0х99 должно получиться именно 99.
Во вторых подставляю как Вы просили val = 0x2D и сколько будет результат ?  smile 



--------------------
PM MAIL WWW   Вверх
zim22
Дата 27.6.2009, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(mes @  27.6.2009,  15:25 Найти цитируемый пост)
Вы о том что что если вместо 0х99 подставить 0х13 то получится 13 вместо 99 ?

 smile 
Цитата(mes @  27.6.2009,  15:25 Найти цитируемый пост)
Но во первых это не отменяет вопрос Ridder`a, о том как человек сходу догадался

вы на этот вопрос уже ответили.
Цитата(mes @  27.6.2009,  15:25 Найти цитируемый пост)
Во вторых подставляю как Вы просили val = 0x2D

вы не честно играете. каждая цифра должна была находиться в диапазоне от 0 до 9, чтобы "прикол" работал smile


--------------------
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0879 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.