Ещё одна Java-задачка

Рубрика: Java, Задачки | 24 June 2007, 19:24 | Vadim Voituk

Задали мне на днях задачку на знание Java:

Какой результат у выражения:
[java]((int) (char) (byte) -1)[/java]

Ответ написан ниже белым цветом на белом фоне :)

Правильный ответ: 65535
Потому как byte - знаковый тип, поэтому -1 = все 8 бит - единички
Поскольку byte - знаковый, а char - нет, то происходит знаковое расширение
в результате (ВНИМАНИЕ!!!) в значении char все 16 бит - единички!
В стандарте это называется widening и narrowing primitive conversion
Вот правило: Sign extension is performed if the type of the original value is signed; zero extension if it is a char, regardless of the type to which it is being converted.

Комментариев: 46

46 Responses to “Ещё одна Java-задачка”

Комментарии:

  1. juriy

    :-) Абалдеть!

    Сорри за содержательный коммент, но действительно абалдеть :-) Вот так любого соискателя можно завалить.

    И насчет белого на белом – тоже отличная идея.

  2. vadim

    Тот, кто мне эту задачку задал, говорил что ещё никто её не решил с первого раза.
    Отсюда вывод – читайте стандарт.

  3. Андрей

    Еще одна никому не нужная нерешаемая задача?

  4. Juriy

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

    С другой стороны, в тестах SCJxxxx масса таких задач. Андрей, вы думаете компания Sun раздавала бы сертификаты за “никому не нужные нерешаемые задачи”?

  5. Андрей

    Ок, возможно я погорячился, но:
    - задача совершенно бесполезная, только если вы не набираете разработчиков компиляторов, поскольку:
    * если человек ее не решил, то это еще ничего не значит
    * если человек ее решил(предположим такой случай), то это значит что он всего лишь обладает неким бесполезным для вас(не разработчиков компиляторов) грузом знаний(как расширяется byte в единственный беззнаковый тип char) и некоторым уровнем развития логики, который целесообразнее определять с помощью более адекватных задач
    * я пытался готовится в прошлом к собеседованиям по екзаменам сан, и на мой взгляд неадеквата там тоже хватает
    * к любителям коллекционировать сертификаты java без надобности(бывают в жизни ситуации, что надобность таки настает) у меня отдельное отношение.

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

  6. vadim

    У меня другое мнение на этот счет:
    Если соискатель правильно ответит на подобный вопрос, то это говорит о том, что он удосужился прочитать стандарт, и что он глубоко вник в предмет, с которым работает (читай Java). А уже дает немногозначительную оценку такому кандидату.
    К тому же на подобном тесте можно проследить ход мыслей кандидата.

    С другой стороны никто не говорит, что решение/нерешение такой задачи должно однозначно влиять на исход собеседования – можно сделать её “по желанию соискателя”.

  7. Char

    >>единственный беззнаковый тип char
    char не единственный беззнаковый тип :) учите матчасть :)

  8. Андрей

    А какой еще?..

  9. Андрей

    Вот кстати другие “”завальные” вопросы которые мне пришли в голову за это время:

    - что будет если вызывать из нескольких потоков методы одного и того же инстанца entity bean-а
    - что случится при выполнении следующего куска кода:
    void notifyTest(Object o) {
    o.notify();
    }
    - могут ли бросать и почему ConcurrrentModificationException обращения к обьекту set если он обьявлен следующим образом:
    Set set = Collections.synchronizedSet(new HashSet());
    - Можно ли опускать нуллы в ArrayList и HashTable и почему?

  10. vadim

    Почему же это завальные вопросы? Вполне практичные и жизненные.

  11. Андрей

    Потому что программист среднего рыночного уровня на них не ответит. Попробуй ответить ты в режиме собеседования(не подглядывая в литературу). Такие вопросы кажутся простыми когда знаешь ответ.

  12. vadim

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

  13. Андрей

    Ну так вот, это вопросы не того вида. Это вопросы типа: знаешь ты какую то определенную фишку или нет. Вопросы на которые нужно беседовать это например:
    - попросить спроектировать поисковый движек/интернет магазин/корзину в эл магазине/менеджер памяти/сервис аутентификации, спросить какие алгоритмы и технологии будешь использовать и почему.

  14. vadim

    Ты не прав.
    Пример: Из 2х десятков прособеседованных мною за последний год людей только 2 кандидата ответило на 4 примитивных вопроса про битовые операции (и только один ответил на ВСЕ 4 ПРАВИЛЬНО). Остальные либо отказались отвечать либо ничего внятного не сказали.
    При этом каждый распылялся про классы, обьекты, шаблоны проектирования, сложные архитектуры, каждый второй делал огромные порталы с высокой нагрузкой и интернет-магазины, использовал все известные мне технологии и аббревиатуры.
    Извините, но больше я на собеседованиях разговоры о высоких технологиях не веду.
    Мне важно видеть задатки фундаметального образования и “правильное” направление мышления во внештатных ситуациях.
    Так вот подобные “неберущиеся” вопросы очень хорошо могут в этом помочь.

    P.S. У меня в списке вопросов на собеседовании нет подобных задач (но очень хотелось бы) :)

  15. Андрей

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

  16. vadim

    Для web-разработчика не знать битовых операций (хотя бы AND и OR) – это нормально???
    Это не разработчик! Это html-верстальщик.

    Заметь, что никто не говорил про web-разработчиков! Это ты сам приписал “web-”

    Если бы теорема про гомоморфизм имела хоть какое-то отношение к практическому
    программированию – я бы спрашивал на cобеседовании и её. Скорее всего не в точной формулировке, но хотя бы дабы проверить что кандидат “что-то о ней слышал”.

  17. Андрей

    Ты сказал про порталы с высокой нагрузкой и интернет магазины.

    Абстрагируясь от стереотипов подумай сам, так ли часто современный веб программист использует битовые операции(если вообще использует). И если есть люди которые их используют — является ли это жизненно необходимым в таких ситуациях. Между тем я согласен что доскональное знание битовых операций необходимо разработчикам пишущим скажем драйвера устройств.

  18. vadim

    Да причем тут часто или не часто? Я использую часто, кто-то не часто, но при этом знать их должен каждый! Не потому что они нужны или не нужны – а потому что это основы.
    Это как примитивные алгоритмы, которым меня учили в школе и на младших курсах университета. Или, по-вашему, их тоже знать/понимать не нужно?

    Если человек не удосужился подучить в школе/универе/самостоятельно бинарную логику, то это не разработчик – это низкокачественный самоучка без фундаментальных знаний, который начал программировать когда понял что на чистом html гостевую книгу на домашней страничке не сделаешь.
    Чему я могу его научить, и какие задачи могу поставить человеку без базовых знаний?
    Как я могу работать с человеком какому прийдется “с нуля” рассказывать что такое граф, битовая маска или какая разница между классом и обьектом?

  19. Андрей

    > Чему я могу его научить, и какие задачи могу поставить человеку без базовых знаний?

    Писать высокопроизводительные порталы и электронные магазины?..

    Во первых давай не будем бросаться в утрирование: речь шла о битовых операциях а не о графах и обьектах и классах. То есть я думаю что количество людей которые на твоих собеседованиях знали что такое граф, обьект и класс было больше 1 из 20. Если нет, то возможно это проблемы ваших ХР, которые плохо проводят скрин интервью, или вы за маленькие деньги хотите супер-мега-гипер профессионалов(типичная современная проблема).

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

  20. vadim

    Ты веришь что люди, которые на вопрос “сколько будет 4&1″ отвечают, “я забыл что это за знак такой &” или вообще отказываются отвечать, могут ответить что такое граф или отличить класс от обьекта? Увольте!
    Скрин-интерью мы не проводим принципиально – не ХР-у работать с этим человеком а мне.
    Насчет денег – никто никогда ещё не жаловался.
    Супер-мега-профи – тоже не самоцель, но если он приходит – мы только рады – с таким человеком приятно работать.
    За знатоками фундаментальных алгоритмов тоже не охотимся.

    Чтобы исключить неопределенность темы спора:
    Графы используются в например разных социальных сетях, алгоритмах поиска пути, анализе статистических данных; битовые маски – как минимум права доступа в unix (только не надо мне говорить что не должен разработчик их понимать).

    Да и не о том спор. Я пытаюсь донести, что такие заковыристые вопросы покажут у человека наличие фундаментальных знаний и умение/желание разобраться во внештатной ситуации. Сосб-но в задачке “((int) (char) (byte) -1)” мне важен не правильный ответ, а ход мыслей.

  21. Андрей

    А я пытаюсь обьяснить что если в выражении (int) (char) (byte) -1) выкинуть (char) то задача становится вообще элементарной. Если оставить то задача заключается в том: “а не удосужился ли человек прочитать стандарт джава и запомнить как именно расширяется byte к char”.

    Про графы: так и не понял где у вас они используются…

    Про скрин интервью: ну что же такой взгляд тоже имеет место быть.

    Про бит маски: программист может делать например так: chmod u+x a.out(как по мне более цивилизованный вариант), и никакие маски ему не нужны, если даже считать команду chmod примером использования битовых масок.

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

  22. vadim

    >> “а не удосужился ли человек прочитать стандарт джава и запомнить как именно расширяется byte к char”.
    Браво! Об этом то я и говорю!
    Если человек прочитал стандарт Java разве это не характеризует его положительно?
    А если нет – то хотя-бы должен попытаться ответить исходя из своих соображений об этом, вот тут и проявляется его понимание того, чем он хочет заниматься.
    В 100ый раз повторяю – мне не интересно ответит ли он правильно или нет – мне интересны его аргументы в пользу его же версии.

    Про деньги и все остальное:
    Ошибаешься. Очень ошибаешься.

  23. Андрей

    Узкое место: byte -> char. Предположим я не знаю как это происходит. Варианты обсуждения:
    - я говорю не знаю.
    - я начинаю придумывать всякие способы.
    Какие могут быть аргументы? Здесь варианты – знаешь или нет, все точка, никаких аргументов быть не может.

    Про деньги и все остальное:
    ссылки на вакансии больше 1000 баксов в студию.

  24. vadim

    “всякие способы” – это и есть твои аргументы!

    >> ссылки на вакансии больше 1000 баксов в студию.
    Нефиг делать:
    http://jooble.com.ua/SearchResult.aspx?kw=mysql+php+%25sl1000&rgn=78&vr=v&date=5&cntmsg=0&p=1

  25. Juriy

    Просто флейм плавно перехоит в холи вор :-) Буду продавать оружие обоим сторонам.

    Значит так, коллеги, предлагаю оставить обсуждение HR, зарплат и компаний. Тем более, не стоит переходить на личности. На developers.org.ua есть отличный раздел, где можно “обсудить” любую компанию.

    Ответьте мне на простой вопрос: как, по вашему, эффективно провести интервью с соискателем? Установка такая: есть пол часа времени, давать “домашние задания” нельзя, так как не вполне ясно, кто их в итоге выполнит. Как адекватно оценить человека?

    Мой подход, это задавать последовательность вопросов от простых к сложным. К примеру:

    1. Чем отличается объект от класса.
    2. Чем отличается абстрактный класс от интерфейса.
    3. Если создать пустой класс, создать объект этого класса и вызвать toString() то что будет? Откуда взялась реализация toString().
    4. Что такое инкапсуляция, наследование?

    ….

    n. В каких случаях следует использовать LinkedList, а в каких ArrayList.
    n+1. Чем отличаются checked и unchecked исключения.

    ….
    ….

    При проектировании real-time системы с требованиями доступности больше 99.9% траву какого народа вы будете курить.

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

    Если вы предложите другую стратегию оценивания – с удовольствием послушаю.

  26. Андрей

    2 Vadim

    Я не совсем понял какое имеет отношение к той ссылке твоя компания. Что бы не заводить спор в тупик, ты ведь работаешь в (удалено администратором)?

    Про аргументы вообще не понял что ты хочешь сказать. Ты наверное хотел что бы я начал фантазировать на тему как можно byte трансформировать в char? Зачем это?

    2 Юрий

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

    Кстати пункты 2 считаю стремным, поскольку:
    - зачем человеку знать как реализован toString в object-e? О чем это будет говорить? (Чесно скажу не знаю как, могу только предполагать что “имя класса @ хеш код”).

  27. Андрей

    Кстати на мой взгляд давать домашние задания можно, так как потом можно за 10 мин наводящих вопросов с приемлемо высокой вероятностью определить кто их делал. Другое дело что это может отпугнуть кандидатов. Я например согласен решать такое задание только ну на очень вкусное предложение.

  28. vadim

    >> зачем человеку знать как реализован toString в object-e
    Вопрос состоит не в том КАК реализован toString(), а в том откуда он взялся в пустом классе (заметь, про Object не сказано ни слова).
    И правильным ответом на этот вопрос будет:
    “3. В результате вызова toString() мы получим результат преобразования обьекта в строку.
    Реализация toString() наследуется от класса-родителя Object”.

    P.S. Текущее место моей работы к этому блогу отношения не имеет, потому я не могу представлять актуальные вакансии на этом месте работы.

  29. Андрей

    Ладно, я так понимаю что начальный вопрос исчерпан, все сделали для себя выводы какие захотели :)

  30. Denis

    Я не ответил на эту задачу и сомневаюсь, что ответил бы на нее через 10 лет. А теперь ситуация: я после этой статьи прихожу на собеседование и мне задають очень похожий вопрос и от этого зависит решение о принятиии меня на работу. Естественно теперь я на него отвечу :) А толку? Я показал умение мыслить? Я от этого лучше знаю устройство сановской ЖВМ? Я могу быть увереным, что такой уродский кастинг будет работать у юзера (кастомера) у которого JVM от IBM или еще от бог знает кого? Мой ответ: не допускать такого уродства в коде.

    PS: Спецификации лучше конечно знать, чем не знать :-)

  31. vadim

    Я показал умение мыслить?

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

    Я могу быть увереным, что такой уродский кастинг будет работать у юзера (кастомера) у которого JVM от IBM или еще от бог знает кого?

    Да. Иначе эта JVM будет называться не Java а какой нибудь JRockit.

  32. Андрей

    JRockit это сертифицированная ДЖ В М.
    Пример несертифицированной: java class path. То есть если такое расширение типов прописаны в спецификациях джава, то оно должно так же работать и у IBM jvm(тоже сертифицирована) и на jrockit но не факт что на jcp(хотя скорее всего там тоже так же работает).

  33. Владимир

    А мне интересно а где можно узнать какие вопросы задают на собеседованиях?

  34. Андрей

    а где можно этот самый стандарт почитать? ..

  35. olex13

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

    PS
    Кстати белый текст на белом фоне – не очень хорошая идея, гугл считает что это обман пользователя и может применить санкции (в плане выдачи в результатах поиска)

  36. Vadim Voituk

    Неужели нынешние разработчикине не пользуются битовыи масками?
    Ну для примера – я использую битовые операции каждый день. Не сложные, но все же они есть.

  37. FedrBodr

    to Vadim Voituk
    Я ни разу не использовал битовые операции,
    но после прочитанного уже записал в список дел))
    Конечно это может быть связанно с некоторой неопытностью(2,5 года) но я о них читал только 3 года назад когда решил стать программистом и потом я их не встречал.

  38. Dzmitry

    >>когда решил стать программистом и потом я их не встречал.

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

    (int x;)
    x&1 == 0 – проверка на чётность
    x&(x-1) == 0 – проверка на то, явл. ли число степенью двойки.

  39. Dzmitry

    Да, скобки я там неправильно расставил – это уж сами :)

  40. hoho

    битовые операции??? это наверно их используют подобные люди которые до сих пор перебирают на радиорынках железо для 386-х :) пора взрослеть ;) чтобы жаба-девелопер использовал в повседневной жизни эти операции … это действительно отсталый способ программировать. Может в разработке эмбедед-систем или драйверов на си, но это уже другая история.

  41. Vadim Voituk

    Типичный комментарий человека, который дальше клепания веб-формочек на Struts&Hibernate в своем професссиональном развитии не продвинулся.
    Причем чаще всего этим страдают люди без
    фундаментального образования и с глупой увереностью что “знают жизнь “, навеянной дефицитом кадров на рынке

  42. Vladimir

    Позволю себе привести пример использования битовых операций на Java.

    При создании Composite в SWT в конструкторе нужно передать параметр int, в котором определен стиль данного Composite.

    Когда разным композитам нужны разные стили очень удобно использовать битовые поля, как например в данном примере.

    как пример:
    new Composite(parent,ExpandableComposite.TITLE_BAR | ExpandableComposite.EXPANDED | ExpandableComposite.TWISTIE);

    Если делать не так, то тогда нужно будет задавать какой-нибудь Map или еще что.

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

    и главное делать это красиво. Если встретишь в коде непонятные манипуляции с битами, то, конечно, не сразу поймешь что к чему. А если вынести такие операции в отдельный класс, сделать для него красивый API, то будет намного лучше.

  43. Sergey

    Читаю ваши статьи, к вам отношусь с уважением и понимаю что вы серьезный разработчик.
    Говорю сразу и честно, что вряд ли бы ответил по битовым операциям на собеседовании. И мне стыдно опыта разработки на java более 5 лет, действительно забыл чему учился в институте :) (прийдется в скорое время вспоминать/исправляться). Да и сам Sun 3-4 назад убрал из своей сертификации вопросы по битовым операциям.
    И вы правы что лучше такие базовые вопросы нельзя забывать/не знать, т.к. сам недавно столкнулся на практике в чужом коде с битовыми масками, пришлось немного задуматься чтобы разобраться. С другой стороны был очень удивлен когда увидел что вы не знаете некоторые основы работы с СУБД (http://voituk.kiev.ua/2009/06/24/mysql-single-row-lock-implementation/).
    Наверное у каждого свои слабые стороны. С уважением.

  44. CacheLot

    Вадим, Адрей, Юрий теперь решите другую задачу:
    [java](byte) 2000[/java]
    Вы же знаете стандарты и математику – на решение 30 секунд. НЕ ПОДСМАТРИВАТЬ! РУКИ ОТ КЛАВИАТУРЫ!
    Получилось? Или всё таки не дочитали стандарт (читать – НЕДОУЧИЛИ) или с математикой проблемы?
    Всё к тому что на всякого найдётся управа.. и нечего строить из себя мегасобеседователей – любого можно опустить так что мать родная не узнает..
    (Ответ: результат деления 16161552 на 336699) – тут уже подсказка впрочем)

  45. Сергей

    маразм

  46. codd

    решил за 8 сек, )) ппц, самое начало жабы тема: “расширение типов”

Leave a Reply