Здравствуйте, Masterspline,
M>Неудачное название переменной. В байте всегда 8 бит.
Чегоооо??? Тебе явно не приходилось сталкиваться с нестандартными архитектурами. А вот мне например приходилось сталкиваться с экзотической архитектурой, где в байте было 18 бит Байт и октет — почувствуйте разницу!
Здравствуйте, AleksandrN, Вы писали:
AN>А какой компилятор и какой код оптимизирует до POPCNT? Сделал подсчёт с помощью сдвигов и битовой маски, но gcc с опциями -O3 -msse4 просто развернул цикл, но POPCNT не использовал. hotspot
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, Тёмчик, Вы писали:
Тё>Отличается тупизной: проверяет память кандидата. Ну по твоим ответам оно заметно.
Да, Артёмка, ignorance is bliss это про тебя.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, vsb, Вы писали:
vsb>Плохое решение. Выкидывать из кеша процессора линию забивая её мусором (а если будет много таких операций — ещё и кучу линий).
Нет, ты за деревьями не видишь леса, не отвлекайся.
vsb>И это при том, что в процессоре есть специальная команда как раз для этой задачи: POPCNT.
Упоминание POPCNT будет плюсом, но будет предложено вернутся к обсуждению алгоритма.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Vlad_SP, Вы писали:
V_S>Чегоооо??? Тебе явно не приходилось сталкиваться с нестандартными архитектурами. А вот мне например приходилось сталкиваться с экзотической архитектурой, где в байте было 18 бит Байт и октет — почувствуйте разницу!
И называлось оно слово (word), но никак не байт
Телеграфный "байт" не равен октету. В архитектурах 70-х иногда обмен с переферией шел 7-разряными "байтами". Вот в подобных случаях очень умозритетельно можно считать, что байт был не 8 бит
Здравствуйте, pagid, Вы писали:
P>Написавший путает разрядность сишного char и размер байта. В архитектурах с адресаций к словам, а не к байтам в С/С++ char имеет размер слова, а не байта.
The fundamental storage unit in the C++ memory model is the byte. A byte is at least large enough to contain any member of the basic execution character set and the eight-bit code units of the Unicode UTF-8 encoding form and is composed of a contiguous sequence of bits, the number of which is implementation-defined.
Здравствуйте, vsb, Вы писали:
vsb>Кстати утяну с JDK реализацию с помощью битовой арифметики: vsb>
vsb> i = i - ((i >>> 1) & 0x55555555);
vsb> i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
vsb> i = (i + (i >>> 4)) & 0x0f0f0f0f;
vsb> i = i + (i >>> 8);
vsb> i = i + (i >>> 16);
vsb> return i & 0x3f;
vsb>
vsb>Это для 32-битов. Фиг его знает, как оно работает, но, по идее, если не использовать отдельные инструкции процессора, то такой код будет крайне быстр, т.к. это просто последовательность быстрых операций без ветвлений, обращений к памяти и прочей гадости, вжух по регистрам и всё.
Как я понимаю, первая строчка — это немного магии чтобы работать int без поддержки unsigned.
А работает оно просто и красиво. Берём число, например для простоты рассмотрим четырёхразрядное 1110, посчитаем вначале кол-во битов в каждоый группе из двух бит (11)(10). Для этого берём у него нечётные биты и чётные (справа налево): _1_0 и 1_1_ (в коде это наложение битовой маски оператором &). Сдвигаем вторую часть (оператор >>>), получается пара _1_0 и _1_1. Их сумма (оператор +) даёт количество битов в каждой паре _1_0 + _1_1 = (10)(01) т.е. (2 шт)(1 шт). Теперь делаем то же но для групп из четырёх бит: __01 и 10__, сдвигаем получается __01 и __10, складываем: __01 + __10 = 11 т.е. (3 шт). И так постоянно удваивая размер группы можно считать для чисел бОльшей разрядности.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
считал что "книжная задачка", "уныло", и не верил опытным товарищам.
Подсчёт битов ничего не говорит о человеке в плане bigO. Поэтому я и сейчас могу повторить- задачка унылая. Можно ещё спросить ieee 754 или перечислить ключи запуска jvm.
Здравствуйте, Тёмчик, Вы писали:
Тё>Подсчёт битов ничего не говорит о человеке в плане bigO.
Ты правда думаешь что это как то сильно отличается от переворота строки?
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, AleksandrN, Вы писали:
AN>Но вполне возможно, что оба участника собеседования могут сделать разные реализации, но реализация сделанная на собеседовании может и совпасть и не совпасть с тем, что ожидают от кандидата.
От кандидата ожидают исключительно демонстрации процесса мышления. Сама задача — лишь повод поговорить. Потому она очень простая и может быть решена разными способами.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, Тёмчик, Вы писали:
Тё>>Подсчёт битов ничего не говорит о человеке в плане bigO. CC>Ты правда думаешь что это как то сильно отличается от переворота строки?
Похоже ты ничего не смыслишь в собеседованиях. Само слово БИТ уже ввергает кучу народа в ужас.
Здравствуйте, 0xCAFEDEAD, Вы писали:
CAF>Похоже ты ничего не смыслишь в собеседованиях. Само слово БИТ уже ввергает кучу народа в ужас.
Мы системщики. Тех, кого слово бит повергает в ужас нам сразу не надо.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Muxa, Вы писали:
M>Ты правда думаешь что мы запоминаем такие формулы, а не выводим по месту? M>Чувак, у меня для тебя плохие новости.
Ну там возможен всего один (оптимальный) вариант решения. Если вы (кстати, кто? социальная группа?) выходите что-то отличное от этого- то это песец из той же оперы, что с переворотом строки.
Здравствуйте, Muxa, Вы писали:
Тё>>Ну там возможен всего один (оптимальный) вариант решения. M>И? Вот этот вариант и выводим.
M>Разных формул в природе миллионы. M>Зачем их все запоминать, если можно один раз раобраться как работают простейшие арифметические и битовые операции, коих всего десяток.
Это не кореллирует с пониманием bigO. Поэтому вопрос негодный.
Здравствуйте, Тёмчик, Вы писали:
Тё>Пока я отсутствовал по причине первого сервиса мота, ещё один бакалавр в Computer Science пал жертвой коварного вопроса.
Ты полгода назад ещё сам
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, Тёмчик, Вы писали:
Тё>>Подсчёт битов ничего не говорит о человеке в плане bigO. CC>Ты правда думаешь что это как то сильно отличается от переворота строки?
Зависит от размера числа. Для 8-битного можно сделать так:
Для чисел большей размерности табличка слишком большой получится. В этом случае можно сложить сумму бит в каждом байте или посчитать с помощью сдвигов и битовых масок. Реализовать подсчёт битов в числе произвольного размера можно тоже по разному. В С++ можно сделать шаблонную функцию, а можно, в стиле C — функцию, в которой передаётся адрес, преобразованный к указателю на uint8_t и размер, а для подсчёта использовать таблицу. В других языках могут быть свои особенности.
Но вполне возможно, что оба участника собеседования могут сделать разные реализации, но реализация сделанная на собеседовании может и совпасть и не совпасть с тем, что ожидают от кандидата.
Здравствуйте, AleksandrN, Вы писали:
Тё>>>Подсчёт битов ничего не говорит о человеке в плане bigO. CC>>Ты правда думаешь что это как то сильно отличается от переворота строки?
AN>Зависит от размера числа. Для 8-битного можно сделать так:
Плохое решение. Выкидывать из кеша процессора линию забивая её мусором (а если будет много таких операций — ещё и кучу линий). И это при том, что в процессоре есть специальная команда как раз для этой задачи: POPCNT.
Здравствуйте, CreatorCray, Вы писали:
Тё>>Подсчёт битов ничего не говорит о человеке в плане bigO. CC>Ты правда думаешь что это как то сильно отличается от переворота строки?
Можно ещё спросить ieee 754 или перечислить ключи запуска jvm.
Отличается тупизной: проверяет память кандидата. Ну по твоим ответам оно заметно.
Здравствуйте, vsb, Вы писали:
AN>>Зависит от размера числа. Для 8-битного можно сделать так:
vsb>Плохое решение. Выкидывать из кеша процессора линию забивая её мусором (а если будет много таких операций — ещё и кучу линий). И это при том, что в процессоре есть специальная команда как раз для этой задачи: POPCNT.
Зависит от процессора. В общем случае неизвестно даже, есть ли в процессоре кэш, не говоря уж об SSE и прочем SIMD.
Здравствуйте, CreatorCray, Вы писали:
Тё>>Отличается тупизной: проверяет память кандидата. Ну по твоим ответам оно заметно. CC>Да, Артёмка, ignorance is bliss это про тебя.
Ты какой-то совсем упертый. Ну считаешь, что трюки с битами отсекут любителей городить O(n*n) на ровном месте и парсить файл путём запихивания в память целиком- это твоё мнение.
Здравствуйте, Тёмчик, Вы писали:
Тё>Ну считаешь, что трюки с битами отсекут любителей городить O(n*n) на ровном месте и парсить файл путём запихивания в память целиком- это твоё мнение.
Артёмка, ты так и не понял смысл подобных задач. Биты там не важны.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
S>Зависит от процессора. В общем случае неизвестно даже, есть ли в процессоре кэш, не говоря уж об SSE и прочем SIMD.
IMHO, это экзотика, когда ты не в курсе, пишешь ли ты программу под STM32f4 или i7, под винду или Мак. Используемые алгоритмы и архитектура софта также будет сильно зависеть от платформы (контроллер это или четырехсокетовый сервер). Так что обычно ты в курсе аппаратной архитектуры, оси и возможных версий сторонних библиотек, которые используются в проекте.
Здравствуйте, CreatorCray, Вы писали:
CC>Артёмка, ты так и не понял смысл подобных задач. Биты там не важны.
Если чел не знает поведение битов- это не делает плохого программиста. А ты просто запомнил простейшую формулу n & (n-1)- совершенно тупой вопрос на память.
Здравствуйте, Masterspline, Вы писали:
S>>Зависит от процессора. В общем случае неизвестно даже, есть ли в процессоре кэш, не говоря уж об SSE и прочем SIMD.
M>IMHO, это экзотика, когда ты не в курсе, пишешь ли ты программу под STM32f4 или i7, под винду или Мак. Используемые алгоритмы и архитектура софта также будет сильно зависеть от платформы (контроллер это или четырехсокетовый сервер). Так что обычно ты в курсе аппаратной архитектуры, оси и возможных версий сторонних библиотек, которые используются в проекте.
Да, но в задании нифига не сказано — там сказано только "посчитайте биты в int32". Довольно странно с таким заданием начинать говорить о каких-то линиях кэша и прочих тонкостях, не спросив, а какой процессор и есть ли вообще кэш.
Здравствуйте, Sharowarsheg, Вы писали:
S>Здравствуйте, Masterspline, Вы писали:
S>>>Зависит от процессора. В общем случае неизвестно даже, есть ли в процессоре кэш, не говоря уж об SSE и прочем SIMD.
M>>IMHO, это экзотика, когда ты не в курсе, пишешь ли ты программу под STM32f4 или i7, под винду или Мак. Используемые алгоритмы и архитектура софта также будет сильно зависеть от платформы (контроллер это или четырехсокетовый сервер). Так что обычно ты в курсе аппаратной архитектуры, оси и возможных версий сторонних библиотек, которые используются в проекте.
S>Да, но в задании нифига не сказано — там сказано только "посчитайте биты в int32". Довольно странно с таким заданием начинать говорить о каких-то линиях кэша и прочих тонкостях, не спросив, а какой процессор и есть ли вообще кэш.
А есть ли там процессор вообще?
Про это может ничего и не сказано, а семантика языка и без процессора существует.
Здравствуйте, 0xCAFEDEAD, Вы писали:
CAF>А есть ли там процессор вообще? CAF>Про это может ничего и не сказано, а семантика языка и без процессора существует.
Здравствуйте, vsb, Вы писали:
vsb>Плохое решение. Выкидывать из кеша процессора линию забивая её мусором (а если будет много таких операций — ещё и кучу линий). И это при том, что в процессоре есть специальная команда как раз для этой задачи: POPCNT.
Вопрос в том, что хочет проверить собеседующий — знание алгоритмов и способность самостоятельно их придумывать/знание тонкостей архитектуры и компилятора/понятность кода/знание побитовых операций/... . И в зависимости от того, какие задачи предстоит решать и какие инструменты использовать, правильный ответ может быть разным.
А какой компилятор и какой код оптимизирует до POPCNT? Сделал подсчёт с помощью сдвигов и битовой маски, но gcc с опциями -O3 -msse4 просто развернул цикл, но POPCNT не использовал.
Здравствуйте, AleksandrN, Вы писали:
AN>А какой компилятор и какой код оптимизирует до POPCNT? Сделал подсчёт с помощью сдвигов и битовой маски, но gcc с опциями -O3 -msse4 просто развернул цикл, но POPCNT не использовал.
Компиляторозависимые интринсики надо использовать. Что-то вроде int __builtin_popcount. Ну или иметь в стандартной библиотеке такие функции и их оптимизировать при компиляции, такое видел в Rust и в Java. Ну или просто на язык ассемблера написать этот кусочек.
Кстати утяну с JDK реализацию с помощью битовой арифметики:
i = i - ((i >>> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
i = (i + (i >>> 4)) & 0x0f0f0f0f;
i = i + (i >>> 8);
i = i + (i >>> 16);
return i & 0x3f;
Это для 32-битов. Фиг его знает, как оно работает, но, по идее, если не использовать отдельные инструкции процессора, то такой код будет крайне быстр, т.к. это просто последовательность быстрых операций без ветвлений, обращений к памяти и прочей гадости, вжух по регистрам и всё.
Здравствуйте, Тёмчик, Вы писали:
Тё>Если чел не знает поведение битов- это не делает плохого программиста.
Таки делает, такой программист для нас сразу не годится.
Тё> А ты просто запомнил простейшую формулу n & (n-1)- совершенно тупой вопрос на память.
Ух какая тупизна! Ты совсем читать не умеешь.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Sharowarsheg, Вы писали:
S>Довольно странно с таким заданием начинать говорить о каких-то линиях кэша и прочих тонкостях, не спросив, а какой процессор и есть ли вообще кэш.
В ответ на вопросы "какой проц, какой кэш" будет отвечено что это irrelevant.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, AleksandrN, Вы писали:
AN>Вопрос в том, что хочет проверить собеседующий
Способность придумывать варианты решения проблемы.
Потому что если человек не способен это делать он годится только в кодеры.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, 0xCAFEDEAD, Вы писали:
CAF>>Похоже ты ничего не смыслишь в собеседованиях. Само слово БИТ уже ввергает кучу народа в ужас. CC>Мы системщики. Тех, кого слово бит повергает в ужас нам сразу не надо.
Да уж понятно, что таких к железу секретному подпускать нельзя. Сломают еще, а оно небось подотчетное
CC>>Артёмка, ты так и не понял смысл подобных задач. Биты там не важны. Тё> А ты просто запомнил простейшую формулу n & (n-1)- совершенно тупой вопрос на память.
Ты правда думаешь что мы запоминаем такие формулы, а не выводим по месту?
Чувак, у меня для тебя плохие новости.
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, Тёмчик, Вы писали:
Тё>>Ну там возможен всего один (оптимальный) вариант решения. CC>No hire, sorry.
А шанс все-таки был. Ээх.
Тё>Ну там возможен всего один (оптимальный) вариант решения.
И? Вот этот вариант и выводим.
Разных формул в природе миллионы.
Зачем их все запоминать, если можно один раз раобраться как работают простейшие арифметические и битовые операции, коих всего десяток.
M>>Разных формул в природе миллионы. M>>Зачем их все запоминать, если можно один раз раобраться как работают простейшие арифметические и битовые операции, коих всего десяток.
Тё>Это не кореллирует с пониманием bigO. Поэтому вопрос негодный.
Здравствуйте, Тёмчик, Вы писали:
Тё>Пока я отсутствовал по причине первого сервиса мота, ещё один бакалавр в Computer Science пал жертвой коварного вопроса.
Косит не программистов, а "программистов" которые по факту ими не являются
Здравствуйте, pagid, Вы писали:
P>Здравствуйте, Vlad_SP, Вы писали:
V_S>>Чегоооо??? Тебе явно не приходилось сталкиваться с нестандартными архитектурами. А вот мне например приходилось сталкиваться с экзотической архитектурой, где в байте было 18 бит Байт и октет — почувствуйте разницу!
P>И называлось оно слово (word), но никак не байт
P>Телеграфный "байт" не равен октету. В архитектурах 70-х иногда обмен с переферией шел 7-разряными "байтами". Вот в подобных случаях очень умозритетельно можно считать, что байт был не 8 бит
The size of the byte has historically been hardware dependent and no definitive standards existed that mandated the size – byte-sizes from 1 to 48 bits are known to have been used in the past.
AM>The size of the byte has historically been hardware dependent and no definitive standards existed that mandated the size – byte-sizes from 1 to 48 bits are known to have been used in the past.
Возьмите любое описание архитектуры с адресацией к 16-18-32-48 разрядным словам, официальное, а не пересказ хабро-хипстерами, хоть современной, хоть исторической, и "байта" по отношению к минимально адресуемой ячейке памяти там не найдете, всегда "слово"
Ну, конечно, все дураки, один умный.
P>Возьмите любое описание архитектуры с адресацией к 16-18-32-48 разрядным словам, официальное, а не пересказ хабро-хипстерами, хоть современной, хоть исторической, и "байта" по отношению к минимально адресуемой ячейке памяти там не найдете, всегда "слово"
"I have heard..." это просто замечательно.
Написавший путает разрядность сишного char и размер байта. В архитектурах с адресаций к словам, а не к байтам в С/С++ char имеет размер слова, а не байта.
Здравствуйте, pagid, Вы писали:
P>"I have heard..." это просто замечательно. P>Написавший путает разрядность сишного char и размер байта. В архитектурах с адресаций к словам, а не к байтам в С/С++ char имеет размер слова, а не байта.
У тебя какое-то узкое трактование понятия "байт". Байт — вовсе необязательно октет. В некоторых архитектурах байты вообще могли быть разного размера:
Some aspects of the instruction set are unusual, most notably the "byte" instructions, which operated on bit fields of any size from 1 to 36 bits inclusive according to the general definition of a byte as a contiguous sequence of a fixed number of bits.
Здравствуйте, AlexMld, Вы писали:
AM>У тебя какое-то узкое трактование понятия "байт". Байт — вовсе необязательно октет.
О чем выше и писал приводя примеры — телеграфный байт, 7-битный байт для обмена с переферией в исторические времена.
AM> В некоторых архитектурах байты вообще могли быть разного размера: AM>https://en.wikipedia.org/wiki/PDP-10 AM>http://pdp10.nocrew.org/docs/instruction-set/Byte.html
В PDP-10 DECовцы назвали "байтами" битовые поля переменной длинны, используемые в командах для упаковки/распаковки в машинное слово символьной и подобной инфы, дело их Но обрати внимание, PDP-10 это архитектура с 36-битным словом, а вовсе не с 36-битным байтом. Именно на это я и обращал внимание с начале разговора — байт не во всех архитектурах минимально адресуемая область памяти. В архитектурах, где адрсация идет к 16-18-24-32-36-48-64 битовым участкам памяти, они называются не байт, а слово. И в PDP-10 точно так же.
Вполне возможно. Не разумно стандартом на язык заставлять реализацию программно упаковывать/распаковывать байты в слова и обратно. Но просто повторение ситуации с char
Здравствуйте, CreatorCray, Вы писали:
CAF>>Похоже ты ничего не смыслишь в собеседованиях. Само слово БИТ уже ввергает кучу народа в ужас. CC>Мы системщики. Тех, кого слово бит повергает в ужас нам сразу не надо.
Меня исходники драйверов повергают в ужас. Треш и угар
Здравствуйте, Тёмчик, Вы писали:
Тё>Здравствуйте, CreatorCray, Вы писали:
CAF>>>Похоже ты ничего не смыслишь в собеседованиях. Само слово БИТ уже ввергает кучу народа в ужас. CC>>Мы системщики. Тех, кого слово бит повергает в ужас нам сразу не надо.
Тё>Меня исходники драйверов повергают в ужас. Треш и угар
Смотри сразу в бинарники тогда. В чем проблема