КАК РАБОТАТЬ С БИТАМИ | ОСНОВЫ ПРОГРАММИРОВАНИЯ
HTML-код
- Опубликовано: 1 июн 2024
- Начни изучать программирование на курсе Frontend-разработчик от Хекслет bit.ly/38He0f1
А чтобы получить скидку 10% - сообщи менеджеру или в чат поддержки кодовое слово AlekOS
🧠 MindBooster от Nooteria Labs: ноотропный комплекс для улучшения внимания, памяти, мотивации и работы мозга: vivaherb.ru/product/mindboost...
Битовые операции.
Из-за того, что в компьютерах используется байтовая адресация, мы вынуждены выделять в памяти минимум 8 бит.
Однако есть задачи, в которых память критична, а размер данных настолько мал, что можно обойтись и битами.
В этом видео показано как работать с каждым битом в отдельности, и в какую структуру данных всё это выльется.
Подписывайся в соц. сетях:
Телеграм - t.me/Alek_OS
ВК - alekos1
Яндекс Дзен - zen.yandex.ru/id/62220edf240e...
❤️ Поддержка канала:
Бусти - boosty.to/alekos
Юмани - yoomoney.ru/to/410011179144828
Патреон - / alekos1
✔️ Полезные ссылки:
Основы программирования - • КАК РАБОТАЕТ ПАМЯТЬ КО...
Полезно знать - • ЯЗЫКИ ПРОГРАММИРОВАНИЯ...
00:00 Введение
02:19 Логические операторы
03:04 РЕКЛАМА
04:41 Битовые операторы
06:03 Сжатие аргументов
07:44 Узнать содержимое бита
08:26 Установка бита в 1
09:02 Установка бита в 0
09:20 Инверсия бита
10:03 РЕКЛАМА
11:31 Функции для работы с битами
12:01 Битовые сдвиги
13:02 Арифметический сдвиг
15:12 Логический сдвиг
15:40 Циклический сдвиг
16:05 Особенности битовых сдвигов
19:05 Дописываем функции для работы с битами
20:37 Битовый вектор
Телеграм - t.me/Alek_OS
ВК - vk.com/alekos1
Яндекс Дзен - zen.yandex.ru/id/62220edf240e7221b567946a
Как работать с битами?
Делать музыку!
@василий сентяй Во первых я ничего не говорил про С++.
Math.floor здесь для наглядности, чтобы когда человек будет писать на своем языке или делить без сдвига, потом не ломал голову почему что-то не работает.
@василий сентяй ок
С битами лучше беззнаковыми целыми работать, но как я понял, в скриптовых ЯП их нет, а в Луа их совсем не было, до версии 5.3.
Особенно нравится графический стиль подачи. Да и содержание на уровне, без воды. Хоть я и достаточно опытный в этой теме, обязательно буду делиться с начинающими вашими уроками. Спасибо.
лесом его, узкая сфера
@@smykoilузкое у тебя мышление, а сфера фундаментальная.
@@user-nl1ff5zc9d хд, буквально несколько дней назад посмотрел урок по си у гоши дудоря, и еще немного поизучал. изменил свое отношение ко многим вещам)
Ура! Учиться!
Ошибка в видео.
В C++ операторы > - это логический сдвиг. Говорю, как программист железячник, который пишет код, наполовину состоящий из всевозможных битовых операций. Ибо у железа полно специальных регистров управления, где различные биты отвечают за работу тех или иных функций железа.
В свое время частенько спотыкался на этом, когда делил числа посредством сдвига. Знак терялся и в итоге я ловил баги.
Арифметический сдвиг вправо в С++ производится посредством оператора деления на число 2 в степени N, где N - количество битов, на которое нужно произвести сдвиг. Впрочем, некоторые ядра, например ARM, поддерживают инструкции для всех трех видов сдвига. Их либо использует компилятор в зависимости от контекста, либо программист пишет ассемблерные вставки, либо использует intrinsic функции (инструкции процессора, выраженные в виде функций), если таковые имеются в библиотеке программируемой платформы.
По поводу преобразования абсолютного индекса искомого бита в индексы строк и колонок. Тут вообще все просто. Колонок у нас 32. Берём младшие шесть бит абсолютного индекса (режем операцией И) - это у нас будет номер бита в конкретной "строке".
Берём старшие 26 бит абсолютного индекса (логический сдвиг на шесть бит вправо) - это у нас будет номер "строки" (индекс массива)
Погоди, в смысле полно регистров управления, он же только 1, не?
@@nakidai Железу выделяется участок физического адресного пространства для всевозможных управляющих регистров и аппаратных буферов. Регистры физически находятся в железке, а процессору они представлены как участок памяти. Но это не просто память, так как запись данных в неё меняет поведение железа. Если это, к примеру, звуковуха, то она требует конфигурацию. Например, разрядность аудиоданных, битрейт, громкость, эффекты, микширование и прочее.
Все эти конфиги пишутся драйвером в привязанный за железом адресный блок. Производитель железа может сделать разные регистры со всевозможным функционалом. Но чтобы операционная система могла работать с тем, что производитель навыдумывал, производитель пишет драйвер. Драйвер можно представить как некий код, где с одной стороны у него торчит стандартный API, через который его дёргает операционка, а с другой стороны драйвер дергает железо через его регистры.
@@kardanium А, то есть у любого подключаемого к матеру устройстве есть свои регистры? Спасибо, буду знать
Лучший коммент, дополню его
int - это не 32 бита
практика умножать/делить сдвигами, это ужасно, Если вам нужно умножать или делить, то именно это и делайте, а сдвиги оставьте для тех мест, где они определяют алгоритм. В 99,9% случаев оптимизатор компилятора сам догадается, что где-то можно оптимизировать операцию, если это технически возможно, а путать колег - не хорошо.
также при передаче параметров в функцию тремя битами упакованными в байт, удобней внутри функции не вынимать уже их, а сразу организовать табличный переход к функциям по адресам (автоматное программирование) и быстрее и удобней выйдет, иначе экономия двух байт на стеке при передачи параметров очень странно выглядит.
@@DmitroVialkov Практика умножать/делить сдвигами - это нормально в покоцанных архитектурах, вроде ARM Cortex-M0, так как ни умножать, ни делить они не могут, либо это обойдется слишком расточительно в плане доступных ресурсов, либо в производительности. Или еще хуже - в разработке аппаратных вычислителей под FPGA или ASIC. Там вообще подход "берем старшие N битов результирующего вектора и..." Компиляторы крайне редко оптимизируют вычислительные операции. И уж точно не заменяют "X / 2^N" на "X >> N", даже если целевой процессор не умеет делить аппаратно.
На счет шести бит я ошибся. Число 31 вмещается в пять бит. Значит нужно взять младшие пять бит индекса. В реальности ничто не мешает использовать в C++ типы фиксированной ширины: int16_t, int32_t, int64_t вместо int. Но если хочется индекс типа int, то и это не проблема:
uint32_t bits[8]; // наши биты
int index = 129; // Номер бита, который хотим инвертировать. Нумерация начинается с нуля.
// Младшие пять бит индекса в качестве номера "колонки":
int column = index & 0x1F;
// column = 1
// Старшие биты индекса в качестве номера "строки":
int row = (index & ~0x1F) >> 5;
// row = 4
// Инвертируем 129й бит
bits[row] ^= 1
Как всегда отлично, Алек. Спасибо за очередной просвещающий ролик. Очень прощу продолжить серию роликов о Ассемблере, спасибо.
Единственный человек, который смог мне доходчиво объяснить логику побитовых сдвигов! Я в восторге. Благодарю
И так как работать с битами. Открываешь Abletone, расставляешь кики, снейры, хеты, берёшь семпл, понижаешь его на актаву вниз, 808. Готово.
А вы не про эти биты, ну тогда погнал
О, спс, я теперь написал кадилак 2.0
Очень классное и полезное видео, я даже оторвался от программирования, чтобы коммент написать
В этом видео прекрасно всё) За 25 минут всё понятно, не представляю сколько понадобилось бы времени в универе с заснувшим преподом
Мощно, так продолжать, спасибо за столь твою кропотливую работу!
Раньше мне не приходилось ещё работать с битовыми операциями. И вот неделю назад появилась потребность... Решил получше разобраться в этой теме, читал информацию пару часов... И через неделю ты выпускаешь ролик по этой теме... Совпадение? Не думаю! Контент как всегда крутой! Мне нравится, как ты преподносишь информацию! Очередной годный ролик на актуальную тему.
Больше спасибо, желаю интенсивного развития твоего канала (рост подписчиков и просмотров)! Это было классно!
следующий ролик от Алека будет о том как руками двигать электроны в компьютере :D
в общем просто спасибо тебе Алек за то что ты есть и что снимаешь такой нужный контент )
Понятное и простое объяснение сложной темы! Спасибо.
Великолепно изложено, а главное своевременно! Алекс, будь здоров и успешен в своих делах и начинаниях!
Огромное спасибо за этот материал! Всегда были некоторые сомнения во время использования побитовых сдвигов и операций над битами, а здесь предствалена вся необходимая информация! Низкий поклон за разбор!
ООО, новый видосик, сенкс
лайк авансом, посмотрю после других роликов
Спасибо за годный контент!!
Шикарно! Всё на высоте! Огромное спасибо!
Очень круто и понятно. Я в асме работал с битами, но вот тут получил хорошие практические примеры и понимание, как можно в высокоуровневых языках делать разные манипуляции. Вроде и знаешь про операции и битовые маски, но когда видишь практические примеры, то всё сразу по полочкам раскладывается. Спасибо огромное за твой труд!
Просто невероятное обьяснение материала ! Очень и очень круто и приятно смотреть!
Большое спасибо! Просто и наглядно, объяснить понятнее, наверное, невозможно
Арифметический сдвиг числа -1 тоже ведь попадает под правило деления. Допустим мы сдвигаем -1 на один бит вправо, т.е. делим на 2, получаем -1/2. Округляем это число в меньшую сторону, получаем -1 т.к. 0 > -1
Красавчик, продолжай в том же духе! Ты делаешь правильное дело, спасибо!!!
Спасибо за твою работу! Лучший в своем деле)
Спасибо огромное! Alek - вы лучший!
Привет.
Ты один из лучших!!!
Спасибо тебе за создаваемое!
Очень ждал новое видео, спасибо.
P.S. следующее видео по Assembler-у?
@@thetraveler7779 да (продолжение), в кометариях Alek недавно вроде писал, что после следуещего будет видео про Assembler
@@thetraveler7779 почему? если я правильно догадываюсь о чем идет речь, то в прошлом видео использовал MASM
@@rorva Из-за возможной блокировки ютуба ассемблер пришлось перенести. Если всё будет норм, то в июне скорее всего он появится.
@@AlekOS Спасибо за ответ)
Огромное спасибо за такой разборчивый видео урок ,хоть он и тяжёлый для усвоения новичку ,ещё раз огромное спасибо
Посмотрю позже когда будет время, лайк сразу ! Знаю что контент годный 👍
Полезно и интересно, с прекрасной подачей. Спасибо^^
Спасибо за уникальный контент (хоть порой не сразу удаётся его воспринять)
спасибо большое за контент, был на собеседовании в институт задали вопрос по теме, и как раз пригодится этот ролик.😊
Прекрасное оформление видео и визуализации идеи, продолжай в том же духе)
*Спасибо! Очень информативно разобрал интересный кейс, благодаря тебе я узнал много нового!*
Круто, не совсем все понял, но понял что побитовые операторы довольно полезная штука)
Если программируешь микроконтроллеры побитовые операторы используется постоянно
Категорический лайк👍 подписался ещё с видео про ассемблер❤
Всё, что идёт после 16:05, я больше ни в одном видео или книге не встречал. Как будто глаза открылись на такие вещи
Очень крутая подача и сразу видно, что с нами общается знаток своего дела. Жду продолжения уроков на ассемблере, ведь одного урока недостаточно)
Великолепные видео у тебя.Ставлю лайк перед просмотром.
Спасибо большое! Очень интересное видео! Определенно лайк👍👍👍
В микроконтроллерах это повсеместно используется:)
Спасибо, стало гораздо понятнее!)
Просто супер! Очень интересно! Спасибо
Мне 14 лет и я хочу досконально изучить все, что связано с компьютерами, операционными системами и айти в целом. Чувак, ты отлично помогаешь, спасибо!
Я тоже. Уже научился питону, c++.
А я уже выучит python, HTML, CSS, Java
А я выучил Java и C++ в 12лет 👍
@@javaproger какой умничка, выучить синтаксис языка это же так сложно))
@@marin232и все же он ещё ребенок, вспомни свои 12 лет😢
Отличный ролик. Проходил это в мшп и думал, что никогда не понадобится, но здесь приведены отличные примеры
Большое спасибо за урок!
Спасибо за очень интересный Ваш материал ..!!
Ты супер! Это то чего реально не хватало на русскоязычном Ютубе.
Это лучшие в наблюдаемой вселенной ролики!
До этого видео вообще не понимал, зачем нужны битовые операции, но после просмотра будто прозрел. Спасибо за качественный контент
Спасибо за видео.Коммент в поддержку!
Хоть ничего нового не узнал, но освежить знания было самое то. 👍👍
Шикарная подача. Продолжай дальше. Удачи в начинаниях. Что за мелодии в роликах?
Спасибо, очень полезно и информативно!
А будет ли продолжение про язык ассемблера?
Спасибо что живой
Спасибо за видеоролик!
Лайк. Полезная инфа. Спасибо тебе.😉
Очень познавательно! Такая подача материала... конечно дорогого стоит. Спасибо.
P. S. Хотелось бы еще и списка рекомендуемых книг дождаться. 🙂(с грамотным погружением в алгоритмы).
Прекрасная работа!
Замечательно. Куча сэкономленного времени. Отличный материал
Приятный голос, внятная речь, грамотная подача материала, все нравиться. Просьба если можно чуть, чуть тише фон музыки. Спасибо огромное!
Лучший ролик про битовые операции и их использование в СНГ ютубе.
Лайк, так держать, отличная подача материала! В видео не был проговорён один важный момент - во многих языках программирования && и || -укороченные(еще называют операторы короткого замыкания) формы логических операторов И и ИЛИ. Отличие от побитовых(| и &) состоит в том, что второй операнд у них вычисляется лишь в случае необходимости. Т.е если левый оператор в выражении &&-ложь, то второй оператор уже не вычисляется. Что касается примера в конце, то числа в массиве numbers ограничены 8192 при размере readed в 256. Размер readed можно не указывать, да и ячейки в readed будут использованы только кратные степени двойки-1. В качестве показа магии упаковки битов в ячейки int такой велосипед конечно сгодится. А если в numbers будет 0, то можно дописать int row = index!=-1?getRow(index)+1:0; Для col аналогично.
Лучший, отличная визуализация
Просто и понятно, спасибо вам
Отличный ролик!
Этим видосом ты спас меня от выгорания, спасибо.
Спасибо, это было круто. С одной стороны звучит все просто, а с другой для непривыкшего к двоичной системе исчисления и к Си мозга - пар из ушей. Я думаю еще пару раз повторить с интервалом пару дней и уляжется😁. Но звучит круто, подача непринужденная.
СУПЕР КЛАСС !!! СПАСИБО !!!!!!!!!!!!
отлично! дай те бог!
Кратко и полезно!
Очень интересно, спасибо за такой подробный материал. В методе getRow округление вниз делать не нужно, т.к. вы говорили что это свойство побитового сдвига, округлять в меньшую сторону если результат не целое число.
Здравствуйте Alek!
пожалуйста, сделайте видео о том, как работает операционная система
Вы все безумней и безумней)) крутой ролик.
Отличное изложение материала👍
это точно
Лайк, очень полезно!
Полезное видео!
Графика и подача огонь🎉
супер круто ) еще бы веб теорию ))
Благодарю за подробный и интересный рассказ.
*Л. а. й. к.*
и
*Р. е. с. п. е. к. т.*
ахах) круто, спасибо) Когда на работе сказали рефакторить код, а ты не хочешь больше этим заниматься и пушнув лиду такое, думаю он поймет что дела с тобой плохи)
офигенное видео
Не глядя лайк.
Привет, контент топ , когда будет 2 урок по ассемблеру?
Ещё не посмотрел видео, но лайк поставил
Про100 комментарий в поддержку канала. Контент пушка!
Спасибо!
Благодарю 🙂
Работал с урдуино на Си, битовыми операторами дёргал порты ввода вывода
Огонь 🔥
Я всегда стараюсь поддерживать скилы работы с битами. Но, честно, приходится работать с ними очень редко.
лучший!!!
Доброго времени суток, надеюсь не затрудню вопросом. Будет ли список книжек?) Ведь скоро конец семестра, а значит отдых и саморазвитие наберут максимальные обороты) Отдельная благодарность за видеоролики.
Классное, наглядно понятное оформление отлично дополняет текст. Этот коммент поросто дополняет лайк ;-)
Очередной шедевр
это точно, грамотно Автор преподносить информацию
Спасибо большое, очень полезно, просмотрел весь плейлист, Но у меня есть один вопрос относительно циклического сдвига: Если мы в освободившуюся ячейку памяти помещаем сдвинутый бит, то почему если сдвигать на большое число мы теряем единицу, ведь во логике она должна была сместитьтся и также по циклу вернуться на какое то значение, почему в какой то момент это единица становится нулем?
Хотелось бы увидеть ролик про branchless программирование (без ветвления)
охохо. наконец-то
видосик
Агитируй пожалуйста донат ссылки в начале ролика. Не знал, что можно поддержать канал, а по факту после просмотра считаю это обязанностью.
Алек, расскажи, пожалуйста, про файловые системы?)